Конференция "KOL" » AnsiCompare и StrList.Find
 
  • BMouradov (20.03.09 16:43) [0]
    Подскажите, уважаемые, почему код выдает разные результаты? KOL 2.87.

    uses KOL;
    begin
     if AnsiCompareStr('R', 'd') < 0 then
       ShowMessage('<')
     else
       ShowMessage('>=');    //  <--

     if StrComp('R', 'd') < 0 then
       ShowMessage('<')      // <--
     else
       ShowMessage('>=');
    end.

    обе функции должны работать с учетом регистра, и в области латинских букв вроде должны дать одинаковые резултьтаты?

    В результате, процедура StrList.Find работает только если сделать StrList.Sort(False), хотя по документации должно быть StrList.Sort(True). Ошибка ли это? Если да, то исправлена ли в последних версиях KOL?
  • mdw © (20.03.09 17:51) [1]
    Сталкивался с таким, не фига, результат разный получается. Функции AnsiCompareStr и StrComp по разному работают.

    Еще ньюанс, если в списке несколько одинаковых строк, то не факт, что будет найдена первая. Просто удовлетворяюшая условию, поэтому если нужна первая, нужно еше от найденой строки назад цикл делать, пока равна (Пол дня убил пока понял в чем дело...:().
  • mdw © (20.03.09 19:31) [2]
    Это я уже StrList.Find имел в виду.
  • Vladimir Kladov © (22.03.09 19:50) [3]
    function Find(const S: AnsiString; var Index: Integer): Boolean;
       {* Returns Index of the first string, equal or greater to given pattern, but
          works only for sorted TStrList object. Returns TRUE if exact string found,
          otherwise nearest (greater then a pattern) string index is returned,
          and the result is FALSE. }

  • mdw (22.03.09 22:14) [4]
    2 Vladimir Kladov
    Владимир, естественно список отсортирован. Но "Returns Index of the first string" выполняется не всегда, вернеее смотря что понимать, под ПЕРВЫМ. Если первая найденая, то да, но не факт, что первая найденая, стоит первой в списке среди одинаковых строк (если их несколько).
  • BMouradov (23.03.09 01:42) [5]
    Даже если все элементы разные, не выполняется "Returns TRUE if exact string found". Find ищет не только exact, но и case-insensitive.
    Почему же при Sort используется StrComp, а при Find - AnsiCompareStr?
  • mdw © (23.03.09 10:56) [6]
    AnsiSort() используйте тогда.
  • Vladimir Kladov © (23.03.09 15:53) [7]
    Да, я понял, в чём претензия. Дело в том, что ищет Find методом деления пополам. Это намного быстрее, чем каждый раз просматривать с самого начала. Но если строки совпали, то какая должна быть уже разница... Или тогда организуйти поиск сами, или используйте Find и после него небольшой пробег назад до первой несовпавшей строки. Вообще-то когда я делал этот Find, я думал прежде всего о списках строк, в которых одинаковых нет.
  • BMouradov (23.03.09 19:02) [8]
    Это претензия от mdw. Я же пишу о другом - по документации Find должен искать строки case sensitive, а в реальности - case insensitive. Иногда это существенно! Также, в документации к Find тогда должна быть указана функция, чем сортировать: то ли Sort(False), то ли AnsiSort... Или, может сделать отдельную процедуру Find_NoCase?

    Так же и AnsiCompareStr вроде должен был выдать False, а выдает True. То ли в документации непорядок, то ли эти функции выполняют не совсем то, что от них ждут, то ли я не понимаю, а почему они именно так работают. Может кто-нибудь объяснить?
 
Конференция "KOL" » AnsiCompare и StrList.Find
Есть новые Нет новых   [134431   +15][b:0][p:0.001]