结构化数组和搜索

时间:2012-01-19 14:06:27

标签: delphi delphi-xe2

我需要一些解决这个问题的建议。我有这个数据结构:

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

var
  myarray: tmyArray;
  myvalue: qmyarray;

我正确设置了myarray的所有值,并且myarray.element的所有值都正确排序,这很好。我遇到的问题是当我想在myarray中搜索myvalue并获得价值时。 对于搜索,我使用binarysearch并写:

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错误] Project1.dpr(98):E2250没有可以使用这些参数调用的'BinarySearch'的重载版本

我不明白我犯了什么错误。

我该如何解决?

1 个答案:

答案 0 :(得分:4)

您只有一个错误,myvalue变量的类型应为PMyArray,而不是QmyArray。下次遇到此类问题时,请尝试使用TArray.BinarySearch的长版本,以便Code Insight实际显示有意义的类型名称。

当你写:

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

编译器需要从参数中猜出数组的类型。如果您错过了myarraymyvalue的类型,则编译器无法确定您真正想要的内容,并且代码洞察无法实际显示您想要的内容。但您可以通过使用以下语法告诉它您要操作的数组类型来帮助它:

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.