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

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

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

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

Сообщение alien308 » 07.11.2017 09:08:06

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

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

Сообщение WAYFARER » 07.11.2017 10:04:00

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

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

Сообщение alien308 » 07.11.2017 10:11:27

Так N квадрат времени надо, лучше отсортировать и на соответсвующих позициях сравнивать. Есть ли способ турусы не разводить?
alien308
новенький
 
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

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

Сообщение wadman » 07.11.2017 10:12:40

По хорошему перед сравнением списки стоит отсортировать.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

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

Сообщение WAYFARER » 07.11.2017 10:31:41

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

Готового способа вроде бы нет.
Я в подобных задачах, когда объем данных достаточно большой, вешаю эти вещи на СУБД, так быстрее и проще выходит.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 517
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

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

Сообщение olegy123 » 07.11.2017 11:41:45

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

Ну тогда если очень часто приходится сравнивать большие данные - проще сделать хеширование с индексированием при размещении..
Оптимизировать до поиска.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение tema » 07.11.2017 13:17:08

А почему не сравнить TStringList.Text? Это как одна строка и сравнить можно без всякого цикла
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение mig-31 » 07.11.2017 13:32:18

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


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

Можно после сортировки обоих TStringList например в первом запретить дупликаты и добавить второй в первый TStringList и проверить, если увеличилось TStringList.Count
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

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

Сообщение alien308 » 07.11.2017 17:03:19

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

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

Сообщение Ichthyander » 07.11.2017 17:38:24

Код: Выделить всё
  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;
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

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

Сообщение pupsik » 07.11.2017 19:32:46

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

Вызывают вопросы:
совпадение строк.... Повторяющихся строк нет
не сильно ясно и возможны варианты.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Дож » 07.11.2017 20:13:24

Помимо сортировки (N*logN), можно посчитать от списков хеш, не зависящий от порядка (например, поXORив md5 элементов), и сравнить полученные хеши (за линию).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение tema » 08.11.2017 10:04:58

Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальше
Код: Выделить всё
if StringList1.Text=StringList2.Text then РАВНЫ
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

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

Сообщение Ichthyander » 08.11.2017 10:52:08

tema писал(а):Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальше
Код: Выделить всё
if StringList1.Text=StringList2.Text then РАВНЫ

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

Добавлено спустя 1 минуту 52 секунды:
И, кстати, хороший вариант предложил Дож... Но не думаю, что топикстартер будет этим заморачиваться
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru