![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчёт
Observer © (2007-02-17 15:52:00)Как осуществить подсчёт одинаковых строк в ListBoxe?
RASkov (2007-02-19 01:48:00) [1]Хотя почти тоже самое, что и в [27]....сорри за боян. пора спать.
RASkov (2007-02-19 01:41:00) [2]Вот еще вариант подсчета:
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)
с сортировкой получше будет
Я что-то не понял как сделать с сортировкой, и чем оно лучше. Если не затруднит приведи пример...
default (2007-02-18 00:28:00) [3]RASkov (18.02.07 00:09) [27]
с сортировкой получше будет
RASkov (2007-02-18 00:09:00) [4]> [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);
fd979 (2007-02-17 21:53:00) [5]
> fd979 © (17.02.07 20:11) [11]
> Проверь вот это. Должно работать, писал прямо сюда. Как
> использовать решай сам. К тому же я не знаю - это ли ты
> хотел:
Я подумал может он именно этого хочет.
default (2007-02-17 21:49:00) [6]fd979 © (17.02.07 21:18) [23]
нет, извини нормальная
только с чего ты взял что нужен ему список строк?
я сабж понял как просто получить общее число дубликатов
вообщем как обычно корявый сабж привёл к разногласиям...
default (2007-02-17 21:44:00) [7]fd979 © (17.02.07 21:18) [23]
реализация кавно если честно
смотреть на неё не могу:)
fd979 (2007-02-17 21:18:00) [8]default © (17.02.07 21:16) [22]
Ну а я что сделал????
default (2007-02-17 21:16:00) [9]о боже:)
я говорил лишь о общем количестве дубликатов
если надо вывести сколько каких строк содержится, то можно создать стринглист, закинуть в него элементы листбокса, отсортировать и один раз пробежаться по отсортированному списку для вывода строк и числа их повторений
default (2007-02-17 21:02:00) [10]fd979 © (17.02.07 20:40) [17]
всё я убежал:):):)
fd979 (2007-02-17 20:49:00) [11]Опять
Твое предложение
ВВОД:
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 20:43:00) [12]fd979 © (17.02.07 20:40) [17]
ну длина исходного списка минус длина списка без дубликатов это будет число дубликатов
fd979 (2007-02-17 20:42:00) [13]Единственное, что смущает меня самого - это то почему я использовал TempListBox: TListBox, можно было простой ТСтрингЛист. говорю же писал прямо сюда и первое, что пришло на ум
fd979 (2007-02-17 20:40:00) [14]
> default © (17.02.07 20:35) [16]
> ну хотя бы сделать как в [6] написано и сторонний наблюдатель
> вмиг поймёт такой код, а при твоём коде он сильно призадумается,
> я вот до сих пор не рискнул в твой код вникать:)
Это ему даст только количество не повторяющихся строк. А мой код возвратит из этого списка:
qwe
asd
zxc
qwe
asd
qwe - 2 раза встречается :)
asd - 2 раза
asd - 1 раз
default (2007-02-17 20:35:00) [15]ну хотя бы сделать как в [6] написано и сторонний наблюдатель вмиг поймёт такой код, а при твоём коде он сильно призадумается, я вот до сих пор не рискнул в твой код вникать:)
fd979 (2007-02-17 20:35:00) [16]То что я написал будет подсчитывать количество всех повторений каждого айтема.
fd979 (2007-02-17 20:32:00) [17]ну не требует и пусть не требует.
Опиши как по легче.
Не решал такой задачи и не знаю существующих инструментов. Первое, что пришло в голову. А то, что я написал реально должно работать. Причем писалось не в Дельфи, а сюда!!!
default (2007-02-17 20:26:00) [18]fd979 © (17.02.07 20:13) [12]
ты слышал о такой вещи как читабельность кода?
я вот посмотрел на твой код и ужаснулся ну не требует такая простая задача таких премудростей
fd979 (2007-02-17 20:13:00) [19]массив А это количество, а В соответственно строки, количество которых указано в массиве А.
fd979 (2007-02-17 20:11:00) [20]Проверь вот это. Должно работать, писал прямо сюда. Как использовать решай сам. К тому же я не знаю - это ли ты хотел:
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;