Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.11;
Скачать: CL | DM;

Вниз

Подсчёт   Найти похожие ветки 

 
Observer ©   (2007-02-17 15:52) [0]

Как осуществить подсчёт одинаковых строк в ListBoxe?


 
RASkov   (2007-02-17 15:56) [1]

http://delphimaster.net/view/1-1171660447/


 
Observer ©   (2007-02-17 15:57) [2]

RASkov большое спасибо


 
RASkov   (2007-02-17 16:03) [3]

> [2] Observer ©   (17.02.07 15:57)

Там не подсчет, там удаление дупликотов...
Для подсчета нужно доработать...


 
Observer ©   (2007-02-17 16:18) [4]

Посмотрел! Но чото мозги уже не работают не знаю как переделать?


 
Observer ©   (2007-02-17 16:29) [5]

как всё таки можно доработать код?


 
default ©   (2007-02-17 16:56) [6]

ну млин скинь содержимое листбокса в стринглист с включённой опцией игнорирования дубликатов и разница длин списков и будет тем что ты ищешь


 
default ©   (2007-02-17 17:13) [7]

можешь ещё так

var
 i, duplCount: Integer;
begin
 duplCount := 0;
 with ListBox1 do
   for i:= 0 Items.Count-1 do
     if Items.IndexOf(Items[i]) > i then Inc(duplCount);


 
default ©   (2007-02-17 17:23) [8]

пусть [7] менее тривиально, но зато лаконичнее чем, вероятно, любые другие варианты решения задачи


 
default ©   (2007-02-17 17:40) [9]

ой, в моей голове другое крутилось
[7] неверно, конечно


 
default ©   (2007-02-17 17:48) [10]

вот в .NET в базовый класс массива(Array) включён перегруженый метод IndexOf в параметрах которого можно задать с какого индекса искать - там бы подобная идея сработала, тут же придётся делать менее лаконично - увы


 
fd979 ©   (2007-02-17 20:11) [11]

Проверь вот это. Должно работать, писал прямо сюда. Как использовать решай сам. К тому же я не знаю - это ли ты хотел:
Var
 A : Array of Integer;
 B : Array of String;
 I, K, Tot : Integer;
 S : String;
begin
 SetLength(A, ListBox1.Items.Count);
 SetLength(B, ListBox1.Items.Count);
// Можешь либо сам создать TempListBox либо просто поставить из палитры компонент на форму - тебе решать
 TempListBox.Visible := False;
 TempListBox.Sorted := True;
 TempListBox.Items := ListBox1.Items;

 I := 0;
 S := TempListBox.Items.Strings[0];
 K := 0;
 Tot := 0;
 repeat
   If S = TempListBox.Items.Strings[I] then
   begin
     K := K + 1;
   end
   else
   begin
     Tot := Tot + 1;
     A[Tot] := K;
     B[Tot] := S;
     S := TempListBox.Items.Strings[I];
     K := 1;
   end;
   I := I + 1;
 until TempListBox.Items.Count = I;

 Tot := Tot + 1;
 A[Tot] := K;
 B[Tot] := TempListBox.Items.Strings[TempListBox.Items.Count - 1];

 For i := 1 to Tot do
 begin
   ShowMessage("A[" + IntToStr(i) + "]=" + IntToStr(A[i]) + "  B[" + IntToStr(i) + "]=" + B[i]);
 end;
end;


 
fd979 ©   (2007-02-17 20:13) [12]

массив А это количество, а В соответственно строки, количество которых указано в массиве А.


 
default ©   (2007-02-17 20:26) [13]

fd979 ©   (17.02.07 20:13) [12]
ты слышал о такой вещи как читабельность кода?
я вот посмотрел на твой код и ужаснулся ну не требует такая простая задача таких премудростей


 
fd979 ©   (2007-02-17 20:32) [14]

ну не требует и пусть не требует.
Опиши как по легче.
Не решал такой задачи и не знаю существующих инструментов. Первое, что пришло в голову. А то, что я написал реально должно работать. Причем писалось не в Дельфи, а сюда!!!


 
fd979 ©   (2007-02-17 20:35) [15]

То что я написал будет подсчитывать количество всех повторений каждого айтема.


 
default ©   (2007-02-17 20:35) [16]

ну хотя бы сделать как в [6] написано и сторонний наблюдатель вмиг поймёт такой код, а при твоём коде он сильно призадумается, я вот до сих пор не рискнул в твой код вникать:)


 
fd979 ©   (2007-02-17 20:40) [17]


> default ©   (17.02.07 20:35) [16]
> ну хотя бы сделать как в [6] написано и сторонний наблюдатель
> вмиг поймёт такой код, а при твоём коде он сильно призадумается,
>  я вот до сих пор не рискнул в твой код вникать:)


Это ему даст только количество не повторяющихся строк. А мой код возвратит из этого списка:

qwe
asd
zxc
qwe
asd

qwe - 2 раза встречается :)
asd - 2 раза
asd - 1 раз


 
fd979 ©   (2007-02-17 20:42) [18]

Единственное, что смущает меня самого - это то почему я использовал TempListBox: TListBox, можно было простой ТСтрингЛист. говорю же писал прямо сюда и первое, что пришло на ум


 
default ©   (2007-02-17 20:43) [19]

fd979 ©   (17.02.07 20:40) [17]
ну длина исходного списка минус длина списка без дубликатов это будет число дубликатов


 
fd979 ©   (2007-02-17 20:49) [20]

Опять

Твое предложение

ВВОД:


qwe
asd
zxc
qwe
asd
qwe
asd
zxc
qwe
asd


Ответ:

qwe
asd
zwc


Мое предложение

ВВОД:

qwe
asd
zxc
qwe
asd
qwe
asd
zxc
qwe


Ответ:
qwe - 4 раза повторяется
asd - 3 раза повторяется
zwc - 2 раза повторяется


 
default ©   (2007-02-17 21:02) [21]

fd979 ©   (17.02.07 20:40) [17]
всё я убежал:):):)


 
default ©   (2007-02-17 21:16) [22]

о боже:)
я говорил лишь о общем количестве дубликатов
если надо вывести сколько каких строк содержится, то можно создать стринглист, закинуть в него элементы листбокса, отсортировать и один раз пробежаться по отсортированному списку для вывода строк и числа их повторений


 
fd979 ©   (2007-02-17 21:18) [23]

default ©   (17.02.07 21:16) [22]

Ну а я что сделал????


 
default ©   (2007-02-17 21:44) [24]

fd979 ©   (17.02.07 21:18) [23]
реализация кавно если честно
смотреть на неё не могу:)


 
default ©   (2007-02-17 21:49) [25]

fd979 ©   (17.02.07 21:18) [23]
нет, извини нормальная
только с чего ты взял что нужен ему список строк?
я сабж понял как просто получить общее число дубликатов
вообщем как обычно корявый сабж привёл к разногласиям...


 
fd979 ©   (2007-02-17 21:53) [26]


> fd979 ©   (17.02.07 20:11) [11]
> Проверь вот это. Должно работать, писал прямо сюда. Как
> использовать решай сам. К тому же я не знаю - это ли ты
> хотел:

Я подумал может он именно этого хочет.


 
RASkov   (2007-02-18 00:09) [27]

> [5] Observer ©   (17.02.07 16:29)

procedure CalcDuplikate(Lst, LstResult: TStrings; const NoResultDup: Boolean=True);
var N, K, J: integer;
begin
for N:=0 to Lst.Count-1 do begin
 J:=0;
 for K:= 0 to Lst.Count-1 do if Lst[N] = Lst[K] then INC(J);
 if not NoResultDup or (LstResult.IndexOf(Lst[N]+" - "+IntToStr(J)+" раз(a)")<0) then
  LstResult.Add(Lst[N]+" - "+IntToStr(J)+" раз(a)");
end;
end;
......
CalcDuplikate(ListBox1.Items, ListBox2.Items);


 
default ©   (2007-02-18 00:28) [28]

RASkov   (18.02.07 00:09) [27]
с сортировкой получше будет


 
RASkov   (2007-02-19 01:41) [29]

Вот еще вариант подсчета:

procedure TForm1.Button1Click(Sender: TObject);
var N, K, J: Integer;
begin
 for N := ListBox1.Count-1 downto 0 do begin
  J:=0;
  for K := 0 to N do if ListBox1.Items[N] = ListBox1.Items[K] then INC(J);
  if ListBox2.Items.IndexOf(ListBox1.Items[N]) < 0 then ListBox2.AddItem(ListBox1.Items[N], TObject(J));
 end;
end;

procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 with (Control as TListBox).Canvas do
  TextRect(Rect, Rect.Left+2, Rect.Top+2, ListBox2.Items[Index]+" - "+IntToStr(Integer(ListBox2.Items.Objects[Index]))+" раз(а)");
end;


(основан на фокусах из ветки про удаления дупликатов):)


> [28] default ©   (18.02.07 00:28)
с сортировкой получше будет

Я что-то не понял как сделать с сортировкой, и чем оно лучше. Если не затруднит приведи пример...


 
RASkov   (2007-02-19 01:48) [30]

Хотя почти тоже самое, что и в [27]....сорри за боян. пора спать.



Страницы: 1 вся ветка

Текущий архив: 2007.03.11;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.059 c
15-1171525596
novill
2007-02-15 10:46
2007.03.11
Есть ли клиенты для просмотра других сайтов по Дельфи?


4-1159517125
MetalFan
2006-09-29 12:05
2007.03.11
считать ATIP информацию с CD-R


1-1169035558
Lockbullet
2007-01-17 15:05
2007.03.11
Конвертация PDF


8-1142438290
ArtSin
2006-03-15 18:58
2007.03.11
Работа со звуком


2-1171650178
Kolan
2007-02-16 21:22
2007.03.11
Создание формы динамически &amp;#151; говорит ресурс не найден.