структурированный массив и поиск - PullRequest
1 голос
/ 19 января 2012

Мне нужны предложения по решению этой проблемы.У меня есть такая структура данных:

type
  QmyArray = array of integer;
  PmyArray = record
    element: Qmyarray;
    value: integer;
  end;
  TMyArray = array of Pmyarray;

var
  myarray: tmyArray;
  myvalue: qmyarray;

Я правильно установил все значения myarray, и все значения myarray.element отсортированы правильно, и это нормально.У меня проблема, когда я хочу найти myvalue в myarray и получить значение.Для поиска я использую двоичный поиск и пишу:

tarray.BinarySearch(myarray, myvalue, index);

и, конечно, это не работает.Потому что я понял, что нужно настроить компаратор, поэтому я пишу:

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

function CompareA(const Left, Right: pmyarray): Integer;
var
  iIndex: Integer;
begin
  Result := CompareB(Left.element[0], Right.element[0]);
  for iIndex := 1 to High(Right.element) do
    if Result = 0 then
      Result := CompareB(Left.element[iIndex], Right.element[iIndex]);
end;

и пробую:

tarray.BinarySearch(myarray, myvalue, index, TComparer<Pmyarray>.Construct(CompareA));

, но в этом случае я получаю эту ошибку:

[DCC Error] Project1.dpr (98): E2250 Не существует перегруженной версии BinarySearch, которую можно вызвать с этими аргументами

, и я не понимаю, где я допустил ошибку.

Как я могу это решить?

1 Ответ

4 голосов
/ 19 января 2012

У вас есть одна единственная ошибка, тип переменной myvalue должен быть PMyArray, а не QmyArray. В следующий раз, когда вы столкнетесь с такой проблемой, попробуйте использовать длинную версию TArray.BinarySearch, чтобы Code Insight действительно показывал значимые имена типов.

Когда вы пишете:

TArray.BinarySearch(myarray, myvalue, index, iComparer)

компилятор должен угадать тип вашего массива по параметрам. Если вы не соответствуете типам myarray и myvalue, компилятор не может сказать, что вы действительно хотите, и понимание кода не имеет шансов фактически показать вам, чего он хочет. Но вы можете помочь ему, указав тип массива, с которым хотите работать, используя следующий синтаксис:

TArray.BinarySearch<PmyArray>(myarray, myvalue, index, iComparer)

При этом компилятор знает, что вы собираетесь работать с массивом PmyArray. Понимание кода также знает это и показывает точные типы параметров, которые ему нужны.

Это работает:

program Project9;

{$APPTYPE CONSOLE}

uses
  SysUtils, Generics.Collections, Generics.Defaults;

type
  QmyArray = array of Integer;
  PmyArray = record
    element: QmyArray;
    value: Integer;
  end;
  TMyArray = array of PmyArray;

var myarray: TMyArray;
    myvalue: PmyArray;
    FoundIndex: Integer;

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

function CompareA(const Left, Right: pmyarray): Integer;
var
  iIndex: Integer;
begin
  Result := CompareB(Left.element[0], Right.element[0]);
  for iIndex := 1 to High(Right.element) do
    if Result = 0 then
      Result := CompareB(Left.element[iIndex], Right.element[iIndex]);
end;

begin
  TArray.BinarySearch<PmyArray>(myarray, myvalue, FoundIndex, TComparer<PmyArray>.Construct(CompareA));
end.
...