Функция нечеткого поиска Lazarus и Delphi результат

Вопросы программирования и использования среды Lazarus.

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

Функция нечеткого поиска Lazarus и Delphi результат

Сообщение wofs » 07.05.2011 18:06:16

Есть некоторая функция, которая сравнивает строки и выдает число, соответствующее по ее мнению степени равности строк.
Код: Выделить всё
function CompareStrings(S1, S2: string; MatchCount: integer): Integer;
var i, j, Count_, Count: integer;

  function Flag:Boolean;
  begin
    Result := false;
    if (i + Count_ <= Length(S1)) and (j + Count_ <= Length(S2)) then
      if S1[i+Count_] = S2[j+Count_] then
        Result:= true;
  end;

begin
  Result := -1;
  Count := 0;

  S1 := AnsiLowerCase(S1);
  S2 := AnsiLowerCase(S2);
  S1 := StringReplace(S1, ' ', '', [rfIgnoreCase, rfReplaceAll]);
  S2 := StringReplace(S2, ' ', '', [rfIgnoreCase, rfReplaceAll]);
  S1 := StringReplace(S1, ''#13#10'', '', [rfIgnoreCase, rfReplaceAll]);
  S2 := StringReplace(S2, ''#13#10'', '', [rfIgnoreCase, rfReplaceAll]);
  if (MatchCount = 0) or (Length(S1) = 0) or (Length(S2) = 0) then
    Exit;

  i := 1;
  repeat
    j := 1;
    repeat
      if S1[i] = S2[j] then
      begin
        Count_ := 1;
        while flag do
          Inc(Count_);
        i := i + Count_ - 1;
        j := j + Count_ - 1;
        if Count_ >= MatchCount then
          Count := Count + Count_;
      end;
      Inc(j)
    until j >= Length(S2);
    Inc(i)
  until i >= Length(S1);

  if Length(S1) < Length(S2) then
    Count_:= Length(S1)
  else
    Count_:= Length(S2);
  Result := Count;
end;                 

использовать:
Код: Выделить всё
var
    Find: integer;
begin
  Find := CompareStrings('оригинальный текст','текст для поиска', 3);//3 - количество слов сравнения
  ShowMessage(IntToStr(Find));
end;

Проблема заключается в том, что данная функция в Delphi 7 дает один результат - близкий к реальному, а в Lazarus совершенно другой и зачастую на несколько порядков отличающийся. Кто подскажет где собака зарыта?
Последний раз редактировалось wofs 07.05.2011 18:34:06, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Функция нечеткого поиска Lazarus и Delphi результат

Сообщение Иван Шихалев » 07.05.2011 18:28:54

Сравниваемые строки точно в ANSI-кодировке?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Функция нечеткого поиска Lazarus и Delphi результат

Сообщение wofs » 07.05.2011 18:33:49

Иван Шихалев писал(а):Сравниваемые строки точно в ANSI-кодировке?

+ 5 баллов!
Код: Выделить всё
var
    Find: integer;
begin
  Find := CompareStrings(Utf8ToAnsi('оригинальный текст'),Utf8ToAnsi('текст для поиска'), 3);//3 - количество слов сравнения
  ShowMessage(IntToStr(Find));
end;

все гут, тож пока за молоком ходил подумал про кодировку :)
спасибо, проблема решена.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru