Страница 2 из 2

Re: Поиск строки в массиве

СообщениеДобавлено: 15.12.2023 23:21:24
Alex2013
iskander писал(а):Потрясающе веский аргумент из уст человека, прожившего уже почти четверть 21 века и по сию пору считающего хеш-таблицу извращением.

Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .

Re: Поиск строки в массиве

СообщениеДобавлено: 15.12.2023 23:25:45
iskander
Alex2013 писал(а):Я не считаю хеш-таблицу извращением просто мне показалось что для этой задачи она избыточна .

Креститься надо, когда мерещится всякое непотребство.

Re: Поиск строки в массиве

СообщениеДобавлено: 15.12.2023 23:30:44
Alex2013
Find действительно быстрее IndexOf
Код: Выделить всё
function TStringList.Find(const S: string; out Index: Integer): Boolean;

var
  L, R, I: Integer;
  CompareRes: PtrInt;
begin
  Result := false;
  Index:=-1;
  if Not Sorted then
    Raise EListError.Create(SErrFindNeedsSortedList);
  // Use binary search.
  L := 0;
  R := Count - 1;
  while (L<=R) do
  begin
    I := L + (R - L) div 2;
    CompareRes := DoCompareText(S, Flist^[I].FString);
    if (CompareRes>0) then
      L := I+1
    else begin
      R := I-1;
      if (CompareRes=0) then begin
         Result := true;
         if (Duplicates<>dupAccept) then
            L := I; // forces end of while loop
      end;
    end;
  end;
  Index := L;
end;



Но увы (Сори, тут я точно поспешил не проверив :oops: ) это не будет работать с CustomSort и пустым списком строк ...
(Хотя это не великая проблема но признаю что "изящества" уже не будет (придется делать свою процедуру поиска ) )
Зы
Но все-же CustomSort действительно существует .
Код: Выделить всё
procedure TStringList.CustomSort(CompareFn: TStringListSortCompare);

begin
  If (FCount>1) and (FForceSort or (FSortStyle<>sslAuto))  then
    begin
    Changing;
    QuickSort(0,FCount-1, CompareFn);
    Changed;
    end;
end;


Зы Зы
Возможно все это проще будет сделать через более "низкоуровневый" ТList там тоже есть механикка для сортировки

Добавлено спустя 59 минут 14 секунд:
По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.

Re: Поиск строки в массиве

СообщениеДобавлено: 16.12.2023 08:55:03
iskander
Alex2013 писал(а):Find действительно быстрее IndexOf

А кто-нибудь подвергал это сомнению?
Alex2013 писал(а):Возможно все это проще будет сделать через более "низкоуровневый" ТList

Да, и желательно на ассемблере.
Alex2013 писал(а):По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.

Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.

Re: Поиск строки в массиве

СообщениеДобавлено: 16.12.2023 16:15:45
Alex2013
iskander писал(а):Да, и желательно на ассемблере.

Ладно ладно уел ! ( признаю, что нужно быть внимательнее... ) Поделом мне. :mrgreen:
iskander писал(а):Вангую: если Абракадабре вдруг вздумается переписать свой легаси VCL на генериках, то вполне можешь и увидеть. Но это вряд ли.

Просто я к тому, что сегодня поддержка джнериков есть, а завтра её может не быть или появится их свершено новая версия (как уже бывало ) . Тем более в LCL не VCL, а ее аналог. А вечно сидеть на старой версии компилятора и лазаруса не получится в принципе. (Если даже с исходным кодом из середины а то и конца 10- х уже туча проблем то что будет дальше? ) Так что без особой нужды юзать "не устоявшуюся технологию" (ИМХО) так себе идея .
.

Re: Поиск строки в массиве

СообщениеДобавлено: 16.12.2023 16:33:16
iskander
iskander писал(а):Так что без особой нужды юзать "не устоявшуюся технологию" (ИМХО) так себе идея .

Если правильно помню, "неустоявшаяся технология" впервые появилась в FPC-2.2.0, то есть примерно 16 лет назад.
Alex2013 писал(а):сегодня поддержка джнериков есть, а завтра её может не быть или появится их свершено новая версия (как уже бывало )

А разве было такое? Что-то не могу припомнить.

Re: Поиск строки в массиве

СообщениеДобавлено: 18.12.2023 12:29:07
Pavia
Начал писать небольшую программку для построения индекса и поиска файлов в нем. Поиск полнотексный. Код специально упрощен.
Так как написание в процессе. Ещё не до конца готова. Надо небольшие штрихи поправить в логике обработки запроса.

https://gitlab.com/pavia00/textlib

Добавлено спустя 1 минуту 8 секунд:
В дальнейшем планирую полную замену персональному поиску от Яндекса.

Re: Поиск строки в массиве

СообщениеДобавлено: 18.12.2023 14:15:04
Alex2013
iskander писал(а):А разве было такое? Что-то не могу припомнить.

Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п. ( плюс чуть "плавали" модули поддержки )

Re: Поиск строки в массиве

СообщениеДобавлено: 18.12.2023 14:43:18
sts
Alex2013 писал(а):По поводу дженериков: что-то я не видел, что их начинают массово применять в новых релизах LCL что (ИМХО) плохой знак.

LCL в прямой зависимости от VCL по совместимости, как тока там, так тут же здесь.

при этом VCL на дженериках как то уныло получается, например, свойство Items: TStrings, по идее должно стать Items: TStrings<E is TObject> и что, при бросани TListBoxа на форму спрашивать что подставить вместо E? а как его задавать? TListBox<E is TObject> а Items: TStrings<E> ? и в "дфм" по умолчанию писать ListBox1: TListBox<TObject>? как то криво, сделать перегружаемый тип синоним для TStrings<E is TObject>, TStrings = TStrings<TObject>, тогда смысл теряется дженерика,
и это еще без учета что TStrings абстрактный класс, надо как то сделать проброс E на реализацию TStringList, property Items: TStrings<E is TObject> => FItems: TStringList<E is TObject>

кароче мутное это дело

Re: Поиск строки в массиве

СообщениеДобавлено: 19.12.2023 10:12:22
iskander
Alex2013 писал(а):Было при переходе к третей версии FPC (или 3.2.0) и когда была мода на странные тральные версии типа 3.2.1 и т.п.

Так генерики-то тут причём? Емнип проблемы были связаны с введением codepage-aware строк.