【发布时间】:2011-11-27 17:18:38
【问题描述】:
我在使用 TList 和 BinarySearch 时遇到了一些问题。我有这个结构:
PDoubleEstr = record
Double: array [1..2] of Integer;
Count: Integer;
end;
TDoubleEstr = TList<PDoubleEstr>;
并声明:
var oDoubleEstr: TDoubleEstr;
然后,我使用这个函数正确初始化列表:
procedure Initialize;
var
iIndex1, iIndex2: Integer;
rDoubleEstr: PDoubleEstr;
begin
oDoubleEstr.Clear;
for iIndex1 := 1 to 89 do
for iIndex2 := Succ(iIndex1) to 90 do
begin
with rDoubleEstr do
begin
Double[1] := iIndex1;
Double[2] := iIndex2;
Count := 0;
end;
oDoubleEstr.Add(rDoubleEstr);
end;
end;
现在,我定义这个过程:
procedure Element(const First: Integer; const Second: Integer; var Value: PDoubleEstr);
begin
with Value do
begin
Double[1] := First;
Double[2] := Second;
end;
end;
然后在我的主程序中:
procedure Main;
var
Value: PDoubleEstr;
Index: Integer;
flag: boolean;
begin
Element(89, 90, Value);
flag := oDoubleEstr.BinarySearch(Value, Index, TDelegatedComparer<PDoubleEstr>.Construct(Compare));
Writeln(Flag:5, oDoubleEstr[Index].Double[1]:5, oDoubleEstr[Index].Double[2]:5);
end;
这让我犯了一个错误。从某种意义上说,索引为“Index”的元素与我输入的元素不对应。 当然, oDoubleEstr 排序正确,不明白我错在哪里。 构造比较是这样定义的:
function TDouble.Compare(const Left, Right: PDoubleEstr): Integer;
begin
Result := Sign(Left.Double[1] - Right.Double[2]);
end;
我认为错误是在构造中,但不被理解为解决它。 一般来说,我想检查元素是否存在,如果存在则获取索引。作为元素,我的意思是在我的情况下只有字段 Double。 我试着解释得更好,我的名单是如此之多:
1 2 // element 0
1 3
......
1 90
......
88 89
88 90
89 90 // element 4004
如果我将 Element 设置为 (89,90),它应该将我作为索引值:4004,如果找到它则为 true,否则为 false。 感谢您的帮助。
【问题讨论】:
标签: delphi delphi-xe2