Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подсчёт


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо