List和BinarySearch索引并非一切正确

时间:2011-12-03 14:13:10

标签: delphi delphi-xe2

我再次遇到关于list和binarysearch的问题。一般来说,我有:

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中加载值,并希望在列表TMyList中找到元素MyArr(包含其中的所有值),然后我使用:

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;

现在,我的问题是并非所有结果都是正确的。在某种意义上,我经常有正确的元素索引和其他时间我有其他索引对应其他元素,在休闲。 我能解决吗?哪里有错误?
我只想在TMyArr中找到与MyArr相对应的索引。 再次感谢。

1 个答案:

答案 0 :(得分:4)

您的Compare功能很好。如果二进制搜索无法正常工作,那只能是因为列表没有按Compare定义的顺序排序。完成填充后,在开始搜索之前,请调用列表中的Sort功能。当您致电Sort时,您必须确保它使用您的比较功能。