トップへ(mam-mam.net/)

配列(TArray)の並び替え(ソート) ~Delphiソースコード集

検索:

配列(TArray)の並び替え(ソート) ~Delphiソースコード集

Uses System.Generics.Collections;

整数(Integer)型配列変数の昇順ソート(並び替え)

UsesにSystem.Generics.Collectionsを追加し、
TMemoをフォームにドラッグ&ドロップ(名前がMemo1)し、
TButtonを1つフォームにドラッグ&ドロップ(名前がButton1)してから以下ソースを使用します。
Uses System.Generics.Collections;

procedure TForm1.Button1Click(Sender: TObject);
var arr:TArray<Integer>; //arr:Array of Integer; でもよい
    ar:Integer;
begin
  //配列の数を3個に設定
  SetLength(arr,3);

  //配列変数3個に値を設定
  arr[0]:=3;
  arr[1]:=5;
  arr[2]:=2;

  //配列の並び替え
  TArray.Sort<Integer>(arr);
  //並び替えた配列をMemo1に出力する(2 3 5 と出力される)
  for ar in arr do
  begin
    Memo1.Lines.Add( Format('%d',[ar]) );
  end;
end;

構造体配列変数の昇順ソート(並び替え)

UsesにSystem.Generics.Collectionsを追加し、
TMemoをフォームにドラッグ&ドロップ(名前がMemo1)し、
TButtonを1つフォームにドラッグ&ドロップ(名前がButton1)してから以下ソースを使用します。
Uses System.Generics.Collections;

procedure TForm1.Button1Click(Sender: TObject);
var points:TArray<TPoint>; //arr:Array of TPoint; でもよい
    point:TPoint;
begin
  //配列の数を3個に設定
  SetLength(points,3);

  //配列変数3個に値を設定
  points[0].X:=3;
  points[0].Y:=3;
  points[1].X:=3;
  points[1].Y:=0;
  points[2].X:=1;
  points[2].Y:=3;

  //配列の並び替え
  TArray.Sort<TPoint>(points);
  //並び替えた配列をMemo1に出力する(1,3  3,0  3,3 と出力)
  for point in points do
  begin
    Memo1.Lines.Add( Format('%d,%D',[point.X, point.Y]) );
  end;
end;

構造体配列のソート(比較クラスを指定して独自順序にする)

UsesにSystem.Generics.Collections, System.Generics.Defaultsを追加し、
TMemoをフォームにドラッグ&ドロップ(名前がMemo1)し、
TButtonを1つフォームにドラッグ&ドロップ(名前がButton1)してから以下ソースを使用します。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Generics.Collections, System.Generics.Defaults ;

type
  //TPoint型の昇順ソート用比較クラス
  TPointAscComparer = class(TComparer<TPoint>)
  public
    function Compare(const Left, Right: TPoint): Integer; override;
  end;
  //TPoint型の降順ソート用比較クラス
  TPointDescComparer = class(TComparer<TPoint>)
  public
    function Compare(const Left, Right: TPoint): Integer; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TPointAscComparer }
function TPointAscComparer.Compare(const Left, Right: TPoint): Integer;
//TPoint型の昇順ソート用比較関数
begin
  //昇順の場合は以下を返す(降順の場合は逆の値を返す必要がある)
  //戻り値 昇順(Left-Right)
  //  <0 : LeftがRightより小さい
  //  =0 : LeftとRightは同じ
  //  >0 : LeftがRightより大きい

  if Left.X < Right.X then
    result:=-1
  else if Left.X > Right.X then
    result:=1
  else
  begin
    if Left.Y < Right.Y then
      result:=-1
    else if Left.Y > Right.Y then
      result:=1
    else
      result:=0;
  end;
end;

{ TPointDescComparer }
function TPointDescComparer.Compare(const Left, Right: TPoint): Integer;
//TPoint型の降順ソート用比較関数
begin
  //降順の場合は以下を返す(昇順の場合は逆の値を返す必要がある)
  //戻り値 降順(Right-Left)
  //  >0 : LeftがRightより小さい
  //  =0 : LeftとRightは同じ
  //  <0 : LeftがRightより大きい

  if Left.X < Right.X then
    result:=1
  else if Left.X > Right.X then
    result:=-1
  else
  begin
    if Left.Y < Right.Y then
      result:=1
    else if Left.Y > Right.Y then
      result:=-1
    else
      result:=0;
  end;
end;


{Form1}
procedure TForm1.Button1Click(Sender: TObject);
var points:TArray<TPoint>; //arr:Array of TPoint; でもよい
    point:TPoint;
begin
  SetLength(points,4);
  //構造体配列の値を設定
  points[0].X:=11;
  points[0].Y:=11;
  points[1].X:=11;
  points[1].Y:=12;
  points[2].X:=0;
  points[2].Y:=1;
  points[3].X:=0;
  points[3].Y:=0;

  //TPoint型配列の昇順ソート(x:0,y:0  x:0,y:1  x:11,y:11  x:11,y:12 が出力される)
  TArray.Sort<TPoint>(points,TPointAscComparer.Create);
  for point in points do
  begin
    Memo1.Lines.Add(
      Format('x:%d,y:%d',[point.X,point.Y])
    );
  end;

  Memo1.Lines.add('');

  //TPoint型配列の降順ソート(x:11,y:12 x:11,y:11 x:0,y:1 x:0,y:0 が出力される)
  TArray.Sort<TPoint>(points,TPointDescComparer.Create);
  for point in points do
  begin
    Memo1.Lines.Add(
      Format('x:%d,y:%d',[point.X,point.Y])
    );
  end;
end;