У меня возникли проблемы с 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;
Получается ошибка. В том смысле, что элементы с индексом «Индекс» не соответствуют элементу, который я набрал.
Конечно, 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
если я установил Элемент как (89,90), то мне следует повернуть меня в качестве индекса значение: 4004 и значение true, если оно найдено, или значение false в противном случае.
Спасибо за помощь.