2012-01-19 4 views
1

이 문제를 해결하려면 몇 가지 제안이 필요합니다. 나는이 데이터 구조가 있습니다 구조화 된 배열 및 검색

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); 

을 물론 제대로 동작하지 않습니다. '

[DCC Error] Project1.dpr(98): E2250 There is no overloaded version of 'BinarySearch' that can be called with these arguments

나는 돈 : 그 필요는 비교자를 정의 이해하기 때문에 그래서 쓰기 :

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)); 

하지만,이 경우이 오류가 나타납니다 내가 실수 한 곳을 이해하지 못한다.

어떻게 해결할 수 있습니까?

+0

이 나에게 사전처럼 보이는 ...... –

+0

예, 가리키고. 며칠 전 예를 보면, 나는 그것이 더 좋았다고 생각합니다. 단지 나는 의심의 여지가있다. 모든 요소를 ​​읽는 데 많은 요소가있는 배열 (백만 단위)이 있기 때문에 4-5 초, 목록은 20-25 초가 걸립니다. 사전이 적은 시간으로 도와 준다면 그것은 나에게도 아주 좋습니다. –

답변

4

유일한 오류가 있습니다. myvalue 변수의 유형은 이 아니라 PMyArray이되어야합니다. 다음 번에 이와 같은 문제가 발생하면 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. 
+0

안녕하세요, 당신의 예제는 문제를 해결하지만 부분적으로 만 해결할 수 있습니다. 입력에서 나는 qmyarray 유형의 변수를 가지고 배열에서 연관된 값을 얻기 위해 배열에서이 값을 검색해야합니다. –

+1

당신은 실제로 선택을하지 않습니다.'TArray.BinarySearch '는'T 배열'을 검색하여'T' 타입의 값을 찾습니다. 귀하의 경우에는'PMyArray' 타입의 변수를 선언하기 만하면됩니다. 필요한 요소로'element' 필드를 초기화하고 검색하십시오. –

관련 문제