2

以下に示すような多次元配列があります。

Matrix => array(
 [0] => array( [0] => 7, [1] => 'hello' ),
 [1] => array( [0] => 3, [1] => 'there' ),
 [2] => array( [0] => 1, [1] => 'world' ),
)

私が達成しようとしているのは、Matrix[i][0] の値を使用してこの配列をソートすることです。これを行う最も効率的な方法は何でしょうか? 再帰的な QuickSort 関数の可能性を調べましたが、多次元配列であるためかなり複雑です。クイックソートの例はたくさんありますが、「文字列の配列の配列」を入力として受け取るものはありません。

私のテキストが意味不明である場合は、説明を求めてください。私はまだDelphiにかなり慣れていません。

4

2 に答える 2

4

Rob がコメントで指摘したように、(バリアントに頼らずに) 整数と文字列の両方を格納する多次元配列を持つ方法はありません。

整数/文字列のペアを含む単なる配列である場合は、およびプロパティTStringListを使用してそれらを に格納し、 を使用して値を並べ替える方がはるかに簡単です。StringsObjectsCustomSortObject

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

function MySortProc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := Integer(List.Objects[Index1]) - Integer(List.Objects[Index2]);
end;

var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    for i := 0 to 10 do
      SL.AddObject(Format('Item %d', [i]),  TObject(Random(i)));
    SL.CustomSort(@MySortProc);
    for i := 0 to SL.Count - 1 do
      WriteLn(Format('%d: %s', [Integer(SL.Objects[i]), SL[i]]));
    ReadLn;
  finally
    SL.Free;
  end;
end.

これにより、

ここに画像の説明を入力

于 2013-01-30T00:07:54.937 に答える
1

まず、データ構造を表現するために正しい型を選択したかどうかを質問します。あなたのタイプは

array of array of string

しかし、内側の配列には常に正確に 2 つの要素があるように見えます。最初の要素は整数で、2 番目の要素は文字列です。その場合、内側の配列をレコードに置き換える必要があります。

type
  TMyElement = record
    ID: Integer;
    Name: string;
  end;

  TMyArray = array of TMyElement;

これで、1 次元配列ができました。それらのいずれかをソートするのに問題はないと思います。


しかし、多次元配列が本当に必要だったとします。配列が不規則であると仮定します。つまり、異なる内部配列が異なる長さを持っていたとします。その配列を 1 次元配列として表示することもできます。次のように宣言します。

  TStringArray = array of string;
  TMyArray = array of TStringArray;

TMyArrayこれで、あたかも 1 次元配列であるかのように並べ替えることができます。

内部配列の型を宣言する必要があることに注意してください。その理由は、ソート関数が外側の配列の要素を比較および交換できる必要があるためです。したがって、それを行うには関数が必要です。そして、それを実現するには型を定義する必要があります。たとえば、交換関数は次のようになります。

procedure Exchange(Index1, Index2: Integer);
var
  temp: TStringArray;
begin
  temp := MyArray[Index1];
  MyArray[Index1] := MyArray[Index2];
  MyArray[Index2] := temp;
end;

を定義TStringArrayしないと、これは不可能です。これは、動的配列の代入互換性規則がかなり厳しいためです。


好きなだけ次元を拡張できます。

  TString2DArray = array of TStringArray;
  TMyArray = array of TString2DArray;

繰り返しますが、標準の配列ソートを使用して、この 3 次元バージョンの をソートできますTMyArray

于 2013-01-30T08:11:20.487 に答える