Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.053 c
15-1171521922
Александр Иванов
2007-02-15 09:45
2007.03.11
Создан квантовый компьютер


11-1150718660
Arvist
2006-06-19 16:04
2007.03.11
Свернуть в трей, скрыть из таскбара


15-1171461962
IMHO
2007-02-14 17:06
2007.03.11
Опрос: программа для создания иконок


2-1171795680
Litestone
2007-02-18 13:48
2007.03.11
Путь к файлу


15-1171379370
dmdel
2007-02-13 18:09
2007.03.11
Кто использует FB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский