GoldenEagle88
@GoldenEagle88

Как лучше сделать проверку на черный список?

msg:='Загрузили '+inttostr(ids.Count)+' id''s';
 Synchronize(memoadd);
 for i:=0 to ids.Count-1 do begin
 if blackids.Count>1 then begin
   for w:=0 to blackids.Count-1 do begin
     if Pos(ids[i],blackids[w])<>0 then begin
     msg:='Пользователь с id'+ids[i]+' в черном списке';
     Synchronize(memoadd);
     goto next;
     end;
   end;
 end else begin
 end;

В стринг лист (ids) загружается список ид от 1 до 1000...
В стринг листе (blackids) те ид которые использовались в программе.

Как лучше сделать проверку ids на наличие blackids.Когда ids=1000 и blackids=5000 ,долго проверяет...
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 2
@zedxxx
Исходный список надо отсортировать, а потом искать по нему не тупым перебором, а бинарным поиском:
var
  MyList: TStringList;
  Index: Integer;
begin
  MyList := TStringList.Create;
  try
    MyList.Add('id1');
    MyList.Add('id2');
    MyList.Add('id3');
    MyList.Sort;   { Find will only work on sorted lists! }
    if MyList.Find('id3', Index) then
    begin
      ListBox1.Items.AddStrings(MyList);
      Label1.Caption := 'id3 has an index value of ' + IntToStr(Index);
    end;
  finally
    MyList.Free;
  end;
end;

P. S. А ещё можно использовать TDictionary или THashedStringList - там поиск будет ещё быстрее.
Ответ написан
Комментировать
2ord
@2ord
Зачем для каждого элемента списка проверять N^2 раз?

Читаем про линейный поиск

В общем случае для массива A это выглядит так:
i := 0;
while (i < N) and (A[i] <> x) do
  inc(i);


Установить i := 0
Цикл i пока список закончился или искомый элемент не соответствует данному из списка
  увеличивать i
Конец цикла
Если i не больше чем количество элементов списка, то найден в списке. // msg:='Пользователь с id'+ids[i]+' в черном списке';
Иначе - не найден.


И, вообще, стоит подумать об использовании SQLite.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы