Сравнение двух TStringList на совпадение строк
Модератор: Модераторы
Сравнение двух TStringList на совпадение строк
Как правильно сравнить два объекта TStringList на совпадение строк? Количество строк одинаковое, порядок может отличатся. Повторяющихся строк нет.
- WAYFARER
- энтузиаст
- Сообщения: 564
- Зарегистрирован: 09.10.2009 00:00:04
- Откуда: г. Курган
- Контактная информация:
Re: Сравнение двух TStringList на совпадение строк
alien308, в цикле, построчно.
Каждую строку первого TStringList сравниваем с каждой строкой второго TStringList.
Каждую строку первого TStringList сравниваем с каждой строкой второго TStringList.
Re: Сравнение двух TStringList на совпадение строк
Так N квадрат времени надо, лучше отсортировать и на соответсвующих позициях сравнивать. Есть ли способ турусы не разводить?
Re: Сравнение двух TStringList на совпадение строк
По хорошему перед сравнением списки стоит отсортировать.
- WAYFARER
- энтузиаст
- Сообщения: 564
- Зарегистрирован: 09.10.2009 00:00:04
- Откуда: г. Курган
- Контактная информация:
Re: Сравнение двух TStringList на совпадение строк
alien308 писал(а):Так N квадрат времени надо, лучше отсортировать и на соответсвующих позициях сравнивать. Есть ли способ турусы не разводить?
Готового способа вроде бы нет.
Я в подобных задачах, когда объем данных достаточно большой, вешаю эти вещи на СУБД, так быстрее и проще выходит.
Re: Сравнение двух TStringList на совпадение строк
alien308 писал(а):Так N квадрат времени надо
Ну тогда если очень часто приходится сравнивать большие данные - проще сделать хеширование с индексированием при размещении..
Оптимизировать до поиска.
Re: Сравнение двух TStringList на совпадение строк
А почему не сравнить TStringList.Text? Это как одна строка и сравнить можно без всякого цикла
Re: Сравнение двух TStringList на совпадение строк
tema писал(а):А почему не сравнить TStringList.Text? Это как одна строка и сравнить можно без всякого цикла
Это прокатит, если все Items в обоих TStringList были записаны однаково по порядку.
Можно после сортировки обоих TStringList например в первом запретить дупликаты и добавить второй в первый TStringList и проверить, если увеличилось TStringList.Count
Re: Сравнение двух TStringList на совпадение строк
Добавить списки к списку можно одной операцией или цикл нужен?
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: Сравнение двух TStringList на совпадение строк
Код: Выделить всё
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;Re: Сравнение двух TStringList на совпадение строк
в простом варианте - третий список и проверка дублей. Тормознуто через лист но можно через деревья. Рассчитано на малые объёмы.
При больших объёмах - сродни шаманству
Вызывают вопросы:
При больших объёмах - сродни шаманству
Вызывают вопросы:
не сильно ясно и возможны варианты.совпадение строк.... Повторяющихся строк нет
Re: Сравнение двух TStringList на совпадение строк
Помимо сортировки (N*logN), можно посчитать от списков хеш, не зависящий от порядка (например, поXORив md5 элементов), и сравнить полученные хеши (за линию).
Re: Сравнение двух TStringList на совпадение строк
Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальше
И дальше
Код: Выделить всё
if StringList1.Text=StringList2.Text then РАВНЫ- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Re: Сравнение двух TStringList на совпадение строк
tema писал(а):Выставить у обоих списков изначально Sorted:=True; Если это свойство выставить при создании списков, то они заполняться будут уже сортированными
И дальшеКод: Выделить всё
if StringList1.Text=StringList2.Text then РАВНЫ
Мы не знаем условия задачи. Возможно порядок их нужно сохранять. Поэтому все-таки я бы порекомендовал проверить все третьим созданным отсортированным изначально списком примерно как в коде, приведенном мною выше
Добавлено спустя 1 минуту 52 секунды:
И, кстати, хороший вариант предложил Дож... Но не думаю, что топикстартер будет этим заморачиваться
