文字列の並び替え
Delphiでは文字列を扱うための関数や手続きがたくさん用意されていますが、文字列の集まり(コレクション、リスト)を扱うためのクラスTStringListも用意されています。これを使って文字列の並び替えを行ってみます。
参照ボタン(エディットボックスの右側のボタン)を押すと、「ファイルを開く」ダイアログを開きます。
OKボタンを押すと、FileNameエディットボックスに表示されているファイルを開いてTStringListオブジェクトに読み込みます。
Resetボタンを押すと、TStringListをクリアします。
Saveボタンを押すと、「ファイルに保存」ダイアログを開き、TStringListオブジェクトの内容をファイルに保存します。
Sortボタンを押すと、TStringListの文字列コレクションを昇順に並び替えます。
ソース(青色部分が記述した部分です)
{ ****************************************************************** 文字列の並べ替え (TStringListの例) ******************************************************************* } unit MainForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; txtFileName: TEdit; cmdBrowse: TButton; cmdOK: TButton; OpenDialog1: TOpenDialog; cmdReset: TButton; cmdSave: TButton; SaveDialog1: TSaveDialog; cmdSort: TButton; procedure cmdBrowseClick(Sender: TObject); procedure cmdOKClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure cmdResetClick(Sender: TObject); procedure cmdSaveClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure cmdSortClick(Sender: TObject); private { Private 宣言 } m_filename: string; m_tokens: TStringList; procedure MakeStringList; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} { 参照ボタン } procedure TForm1.cmdBrowseClick(Sender: TObject); begin // 「ファイルを開く」ダイアログを開いてフィル名を得る if OpenDialog1.Execute = True then m_filename := OpenDialog1.FileName else m_filename := ''; txtFileName.Text := m_filename; end; { OKボタン } procedure TForm1.cmdOKClick(Sender: TObject); begin MakeStringList; { トークンのリストを作る } end; { 初期化 } procedure TForm1.FormCreate(Sender: TObject); begin m_tokens := TStringList.Create; // 文字列リストオブジェクトを作る end; { 閉じるとき } procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin m_tokens.Free; end; { トークンのリストを作る } { 注意: m_tokens.LoadFromFile(m_filename)としたほうが簡単です。ファイル操作 例として作ってあります。 } procedure TForm1.MakeStringList; var token: string; f: TextFile; begin // ファイルを開く if m_filename = '' then Exit; AssignFile(f, m_filename); Reset(f); // 最初のトークンを得る Readln(f, token); // トークンがある間繰り返す while Eof(f) = False do begin m_tokens.Add(token); Readln(f, token); end; CloseFile(f); MessageDlg('文字列リストを読み込みました。', mtInformation, [mbOK], 0); end; { トークンリストをクリアする } procedure TForm1.cmdResetClick(Sender: TObject); begin m_tokens.Clear; end; { トークンリストを保存する } procedure TForm1.cmdSaveClick(Sender: TObject); begin if SaveDialog1.Execute = True then begin m_tokens.SaveToFile(SaveDialog1.FileName); end; end; { 並べ替える } procedure TForm1.cmdSortClick(Sender: TObject); begin m_tokens.Sort; MessageDlg('文字列を並べ替えました。', mtInformation, [mbOK], 0); end; end.
入力データ例
AAA
BAB
BBA
ACC
BAA
AAB
CAC
ABC
BCA
ソート結果
AAA
AAB
ABC
ACC
BAA
BAB
BBA
CAC