Сравнение двух TStringList на совпадение строк

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Сравнение двух TStringList на совпадение строк

Сообщение alien308 »

Как правильно сравнить два объекта TStringList на совпадение строк? Количество строк одинаковое, порядок может отличатся. Повторяющихся строк нет.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение WAYFARER »

alien308, в цикле, построчно.
Каждую строку первого TStringList сравниваем с каждой строкой второго TStringList.
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Re: Сравнение двух TStringList на совпадение строк

Сообщение alien308 »

Так N квадрат времени надо, лучше отсортировать и на соответсвующих позициях сравнивать. Есть ли способ турусы не разводить?
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение wadman »

По хорошему перед сравнением списки стоит отсортировать.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение WAYFARER »

alien308 писал(а):Так N квадрат времени надо, лучше отсортировать и на соответсвующих позициях сравнивать. Есть ли способ турусы не разводить?

Готового способа вроде бы нет.
Я в подобных задачах, когда объем данных достаточно большой, вешаю эти вещи на СУБД, так быстрее и проще выходит.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Re: Сравнение двух TStringList на совпадение строк

Сообщение olegy123 »

alien308 писал(а):Так N квадрат времени надо

Ну тогда если очень часто приходится сравнивать большие данные - проще сделать хеширование с индексированием при размещении..
Оптимизировать до поиска.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Re: Сравнение двух TStringList на совпадение строк

Сообщение tema »

А почему не сравнить TStringList.Text? Это как одна строка и сравнить можно без всякого цикла
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Сравнение двух TStringList на совпадение строк

Сообщение mig-31 »

tema писал(а):А почему не сравнить TStringList.Text? Это как одна строка и сравнить можно без всякого цикла


Это прокатит, если все Items в обоих TStringList были записаны однаково по порядку.

Можно после сортировки обоих TStringList например в первом запретить дупликаты и добавить второй в первый TStringList и проверить, если увеличилось TStringList.Count
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Re: Сравнение двух TStringList на совпадение строк

Сообщение alien308 »

Добавить списки к списку можно одной операцией или цикл нужен?
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение Ichthyander »

Код: Выделить всё

  with TStringList.Create do
begin
  Sorted:=True;
  Duplicates:=dupIgnore;
  AddStrings(Strings1);
  if Count<>Strings1.Count then
    Result:='Все-таки были дубликаты';
  AddStrings(Strings2);
  if Count=Strings2.Count then
   Result:='Строки равны';
end;
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение pupsik »

в простом варианте - третий список и проверка дублей. Тормознуто через лист но можно через деревья. Рассчитано на малые объёмы.
При больших объёмах - сродни шаманству :lol:

Вызывают вопросы:
совпадение строк.... Повторяющихся строк нет
не сильно ясно и возможны варианты.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Re: Сравнение двух TStringList на совпадение строк

Сообщение Дож »

Помимо сортировки (N*logN), можно посчитать от списков хеш, не зависящий от порядка (например, поXORив md5 элементов), и сравнить полученные хеши (за линию).
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Re: Сравнение двух TStringList на совпадение строк

Сообщение tema »

Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальше

Код: Выделить всё

if StringList1.Text=StringList2.Text then РАВНЫ
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Re: Сравнение двух TStringList на совпадение строк

Сообщение Ichthyander »

tema писал(а):Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальше

Код: Выделить всё

if StringList1.Text=StringList2.Text then РАВНЫ

Мы не знаем условия задачи. Возможно порядок их нужно сохранять. Поэтому все-таки я бы порекомендовал проверить все третьим созданным отсортированным изначально списком примерно как в коде, приведенном мною выше

Добавлено спустя 1 минуту 52 секунды:
И, кстати, хороший вариант предложил Дож... Но не думаю, что топикстартер будет этим заморачиваться
Ответить