Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Подсчет слов в ListBox


Автор: lotax 4.7.2005, 10:24
Здравствуйте, пожалуйста помогите разобраться, есть проблема: есть listbox в нем список состоящий из :
String1
String2
String1
String1
String3
String2
String2
String2
String3

не подскажете как мне подсчитать каждое слово, тоесть у меня должен быть такой результат:
String1 (count:3)
String2 (count:4)
String3 (count:1)

если можно пример.





Автор: Satana 4.7.2005, 10:36
ну у тебе нужно посчитать количество пробелов +1.
т.е. получится чтото вроде этого:

Код

for j:=1 to ListBox1.items.count-1 do
begin
count:=count+1; //можно так
for i:=1 to length(ListBox1.items.strings[j]) do
begin
 if ListBox1.items.strings[i]=' ' then count:=count+1;
 if i=length(ListBox1.items.strings[j]) then count:=count+1; //а можно так, но нужно использовать чтото одно
end;
end;

на выходе у тебя в count должно быть общее количество слов.

Автор: lotax 4.7.2005, 10:47
есть такой вариант
Код

var
a:array of integer;
k,i,j,t,iden:integer;
begin
k:=listbox1.Items.Count-1;
setlength(a,k+1);
for i:=0 to high(a) do
a[i]:=strtoint(listbox1.items.strings[i]);
for i:=0 to high(a) do
begin
t:=a[i];iden:=0;
for j:=0 to high(a) do
begin
if a[j]=t then iden:=iden+1;
end;
listbox2.Items.Add(inttostr(t)+' '+inttostr(iden));
end;
end;


Автор: Satana 4.7.2005, 11:00
мой вариант проще но не гарантирует разбивку на слова если они будут разделены скажем не 1м а двумя пробелами

Автор: Quadr0 4.7.2005, 11:26
...

Автор: lotax 4.7.2005, 11:30
(string1, string2 - без пробелов) , У меня в итоге (по моему коду) формируются дубл. строки я в принципе могу убрать дубл. строки, но мне кажется есть решение проще, чем мое. smile

Автор: Quadr0 4.7.2005, 11:57
...

Автор: Akella 4.7.2005, 12:21
Нужно что-то вроде такого:
бежим циклом по списку и добавляем все слова в массив, но с проверкой

если слово уже в массиве то увеличиваем на 1

Структура строки в массиве такова

arr[i]:='слово::число'

пишем функцию по выдиранию и запихиванию числа в строку - 'слово::число'
Код

sStr := 'слово1::10';
...

Var
iCount:integer;
...
iCount:=Copy(sStr,POS(sStr,'::'),Length(sStr-POS(sStr,'::')));



в итоге получится
arr[1]:='слово1::10'
arr[2]:='слово::20'
...

Автор: lotax 4.7.2005, 13:15
вообщем у меня вышло так :

Код

procedure TForm1.Button1Click(Sender: TObject);
var
a:array of integer;
k,i,j,t,iden:integer;
begin
k:=listbox1.Items.Count-1;
setlength(a,k+1);
for i:=0 to high(a) do
a[i]:=strtoint(listbox1.items.strings[i]);
for i:=0 to high(a) do
begin
t:=a[i];iden:=0;
for j:=0 to high(a) do
begin
if a[j]=t then iden:=iden+1;
end;
if ListBox2.Items.IndexOf(inttostr(t)+':'+inttostr(iden))=-1 then
listbox2.Items.Add(inttostr(t)+':'+inttostr(iden));
end;
end;

smile
Спасибо всем!!!!!!

Автор: Akella 4.7.2005, 15:10
lotax
не выйдет
Добавлено @ 15:11
выйдет, если в списке только цыфры

Автор: lotax 4.7.2005, 15:14
я сделал примерно так
Код

работа с string
var
a:array of integer;
k,i,j,t,iden:integer;
begin
k:=listbox1.Items.Count-1;
setlength(a,k+1);
for i:=0 to high(a) do
a[i]:=listBox1.Items.IndexOf(listBox1.Items.Strings[i]);
for i:=0 to high(a) do
begin
t:=a[i];iden:=0;
for j:=0 to high(a) do
begin
if a[j]=t then iden:=iden+1;
end;
if ListBox2.Items.IndexOf(listBox1.Items.Strings[t]+':'+inttostr(iden))=-1 then
 listbox2.Items.Add(listBox1.Items.Strings[t]+':'+inttostr(iden));
end;
end;


Добавлено @ 15:17
Извиняюсь, за ошибки smile

Автор: Akella 4.7.2005, 15:33
с пустыми строками работать не хочет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)