2015-10-26 3 views
0

Кто-нибудь может помочь, что является лучшим способом сравнить два строковых списка и получить от них отличные результаты?Удалить несколько элементов из TStringList после сравнения

Например, если у меня есть ALIST и Blist как

ALIST

  • ABC
  • CDE
  • EFG
  • KLM
  • STA
  • LMO
  • TKJ

Blist

  • АВС
  • CDE
  • EFG
  • КЛМ
  • СТА
  • LMO
  • TKJ
  • FGJ
  • FGJ
  • ARE
  • IJE

Если сравнивать их, как

 for i := 0 to BList.count-1 do 
     if AList.indexof(BList[i]) < 0 then 
     ResultList.Add(BList[i]); 

Результат является:

  • FGJ
  • FGJ
  • ARE
  • IJE

мне нужны элементы только один раз. Как я могу избежать нескольких элементов? Есть ли лучшее решение, чем сделать процедуру, которая удаляет несколько элементов из списка? Извините за мой английский и спасибо за помощь!

+1

Похоже, у вас уже есть решение - просто добавьте еще один чек 'если ResultList.indexof (Blist [я]) <0 затем' –

+0

Как долго ваши списки? Вы знаете скорость алгоритма? – MBo

+0

Я заполняю оба списка из базы данных, поэтому длина будет переменной. От 200 до 5000+ записей. Да, я боюсь. Зачем? – Steve88

ответ

8

TStringList имеет свойство Duplicates, которое контролирует, что должно произойти, когда дубликаты попытаются быть добавлены в список отсортированных.

Из документации:

dupIgnore Игнорировать попытки добавить повторяющиеся строки в списке.

dupError возбудит исключение EStringListError при попытке добавить повторяющиеся строки в отсортированном списке.

dupAccept Разрешить дубликаты строк в отсортированном списке.

Таким образом, установить

ResultList.Sorted := True; 
    ResultList.Duplicates := dupIgnore; 
+0

FWIW, это очень неэффективно для больших наборов данных из-за накладных расходов на обслуживание отсортированного списка и поиска дубликатов при каждом добавлении в список. –

Смежные вопросы