我再次遇到关于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相对应的索引。
再次感谢。
答案 0 :(得分:4)
您的Compare
功能很好。如果二进制搜索无法正常工作,那只能是因为列表没有按Compare
定义的顺序排序。完成填充后,在开始搜索之前,请调用列表中的Sort
功能。当您致电Sort
时,您必须确保它使用您的比较功能。