Список и индекс BinarySearch не каждый правильный - PullRequest
1 голос
/ 03 декабря 2011

У меня снова возникла проблема со списком и бинарным поиском.В общем, у меня есть:

type
  TMyArr = array [1..5] of Integer;    

  PMyList = record
    Comb: TMyArr;
    ... // other fields    
  end;
  TMyList = TList<PMyList>;

var 
  MyArr: TMyArr; 
  MyList: TMyList;  
  rMyList: PMyList;

Я загружаю значение в массив MyArr и хочу найти элемент MyArr (со всеми значениями в нем) в списке TMyList, затем я использую:

rMyList.Comb := MyArr;
MyList.BinarySearch(rMyList, iIndex3, TDelegatedComparer<PMyList>.Construct(Compare));

Сравнение определено так:

function CompareInt(const Left, Right: Integer): Integer;
begin
  if Left < Right then
    Result := -1
  else if Left > Right then
    Result := 1
  else
    Result := 0;
end;

function Compare(const Left, Right: PMyList): Integer;
begin
  Result := CompareInt(Left.Comb[1], Right.Comb[1]);
  if Result = 0  then
    Result := CompareInt(Left.Comb[2], Right.Comb[2]);
  if Result = 0  then
    Result := CompareInt(Left.Comb[3], Right.Comb[3]);
  if Result = 0  then
    Result := CompareInt(Left.Comb[4], Right.Comb[4]);
  if Result = 0  then
    Result := CompareInt(Left.Comb[5], Right.Comb[5]);
end;

Теперь моя проблема в том, что не все результаты верны.В том смысле, что часто у меня есть правильный индекс элемента и в другой раз у меня есть другой индекс, соответствующий другому элементу, в casual.Как я могу это решить?Где у меня ошибка?
Я хочу только найти индекс, соответствующий MyArr в TMyArr.Еще раз большое спасибо.

1 Ответ

4 голосов
/ 03 декабря 2011

Ваша Compare функция в порядке. Если бинарный поиск не работает должным образом, то это может быть только потому, что список не упорядочен в порядке, определенном Compare. Вызвать функцию Sort в списке, как только вы закончите заполнять, и прежде чем начать поиск. Когда вы звоните Sort, вы должны убедиться, что он использует вашу функцию сравнения.

...