Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизПодсчёт Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c