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 函数的可能性,但它相当复杂,因为我是多维数组。有许多快速排序的示例,但没有一个可以处理将“字符串数组的数组”作为输入。

如果我的文字看起来乱码,请要求澄清。我对德尔福还是很陌生。

4

2 回答 2

4

正如 Rob 在他的评论中指出的那样,没有办法拥有一个存储整数和字符串的多维数组(不诉诸变体)。

TStringList如果它真的只是一个包含整数/字符串对的数组,那么使用Stringsand属性将它们存储在 a 中会容易得多Objects,然后使用CustomSortObject值进行排序:

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

但看起来内部数组总是有两个元素,第一个是整数,第二个是字符串。在这种情况下,内部数组应替换为记录。

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

  TMyArray = array of TMyElement;

现在你只有一个一维数组。我假设您对其中之一进行排序没有困难。


但是假设您确实需要一个多维数组。假设数组是参差不齐的,即不同的内部数组有不同的长度。您仍然可以将该数组视为一维数组。像这样声明它:

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

现在您可以将其排序TMyArray为一维数组。

请注意,我需要为内部数组声明一个类型。原因是排序函数需要能够比较和交换外部数组的元素。所以你需要函数来做到这一点。你需要定义一个类型来实现它。例如,您的交换函数可能如下所示:

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;

同样,您可以使用标准数组排序来对TMyArray.

于 2013-01-30T08:11:20.487 回答