Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как найти дубликаты ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 862
Есть некий массив из 200к+ строк(Пусть это будет StringList).
Некоторые из них - могут повторяться.
Как составить список одинаковых элементов ?
10 янв 17, 17:14    [20090377]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9075
Valery_B,

Отсортировать
10 янв 17, 17:26    [20090434]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 21446
System.Classes.TStringList.Duplicates
dupError raise an EStringListError exception when an attempt is made to add duplicate strings to the sorted list
10 янв 17, 17:28    [20090446]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 352
Чуток г..кода
var
  i:Integer;
  slWithDuplicates, slTemp, slDups:TStringList;
begin
  for I := 0 to slWithDuplicates.Count-1 do
    if slTemp.IndexOf(slWithDuplicates.Strings[i])=-1 then
      slTemp.Add(slWithDuplicates.Strings[i])
    else
      slDups.Add(slWithDuplicates.Strings[i]) //List of dublicates
10 янв 17, 17:35    [20090480]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 862
Как сортировка покажет список дубликатов ?

А список уже есть, в него не добавляется ничего.
10 янв 17, 17:36    [20090483]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
rgreat
Member

Откуда:
Сообщений: 2845
Valery_B
Как сортировка покажет список дубликатов ?

А список уже есть, в него не добавляется ничего.
2 соседних значения одинаковые - значит дубликаты.
10 янв 17, 17:39    [20090497]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 862
Kast2K
Чуток г..кода


Да, я так пробовал)
Получается сюрприз на функции IndexOf когда количество элементов 200к+
Короче, скорость падает экспонтенциально.
Завершения я так и не дождался....
10 янв 17, 17:45    [20090533]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 21446
Valery_B
Kast2K
Чуток г..кода


Да, я так пробовал)
Получается сюрприз на функции IndexOf когда количество элементов 200к+
Короче, скорость падает экспонтенциально.
Завершения я так и не дождался....

Сортировку свою подсунь, там и делай, что хочешь с дубликатами.
10 янв 17, 17:52    [20090577]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Xupypx
Guest
Valery_B,

Массив хэшей, где хэш есть индекс массива?
10 янв 17, 17:54    [20090585]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 862
Xupypx
Valery_B,
Массив хэшей, где хэш есть индекс массива?

Ну что то типа...
10 янв 17, 17:57    [20090599]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
rgreat
Member

Откуда:
Сообщений: 2845
Valery_B
Ну что то типа...

В StringList-е нету хешей...
10 янв 17, 17:58    [20090613]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9075
Valery_B
Как сортировка покажет список дубликатов ?
Без обид, но с такими вопросами вам лучше использовать Embedded DB
10 янв 17, 17:59    [20090617]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Xupypx
Guest
rgreat,

Дык ручками, ручками)
10 янв 17, 18:01    [20090627]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1269
Valery_B
Да, я так пробовал)
Получается сюрприз на функции IndexOf когда количество элементов 200к+
Короче, скорость падает экспонтенциально.
Завершения я так и не дождался....
Хреново видать пробовал. Нет там никакой экспоненты, тупо после сортировки пробегается по списку в один проход и получаются дубликаты.
10 янв 17, 19:05    [20090831]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 1680
Valery_B,

 sl := TStringList.Create;
 Try

  For Index := 1 To 1000000 Do
   sl.Add(IntToStr(Random(MaxInt)));

  dict := TDictionary<String, Integer>.Create(sl.Count);
  Try

   For Index := 0 To sl.Count - 1 Do
    If Not dict.ContainsKey(sl.Strings[Index]) Then
     dict.Add(sl.Strings[Index], 1)
    Else
     writeln(sl.Strings[Index]); // дубликат

  Finally

   dict.Free;

  End;

 Finally

  sl.Free;

 End;
10 янв 17, 19:50    [20090953]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Dimonka
Member

Откуда:
Сообщений: 831
Напрашивается тупое:

SL := TStringList.Create;
SL.Sorted := True;
SL.Duplicates := dupIgnore;
10 янв 17, 19:52    [20090959]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1005
Kazantsev Alexey,

вот почему правильный словарь должен возвращать результат операции Add.
10 янв 17, 19:56    [20090982]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 1680
Aleksandr Sharahov,

Правильный, должен ;)
10 янв 17, 20:13    [20091048]     Ответить | Цитировать Сообщить модератору
 Re: Как найти дубликаты ?  [new]
rgreat
Member

Откуда:
Сообщений: 2845
Aleksandr Sharahov
вот почему правильный словарь должен возвращать результат операции Add.

Угу. У меня вот есть и
function  AddUnique(const ID: TKey; const Value: TValue):integer; overload;
и
property OnDuplicateKeyRule: TRaiseMode;  TRaiseMode = (rmSilentRaise, rmRaise, rmIgnore);
10 янв 17, 20:17    [20091060]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить