配列(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;