2010年9月12日日曜日

JoinStringはないの?(その2)

Delフサさんから指摘を受けましたので、オープン配列版のJoinString関数を
作成してみました。(Delフサ様ご指摘ありがとうございます。)

でついでに、文字列の最後にDelemeterを付加するかどうかを指定できる
オーバーロード関数をも作ってみました。

以下、ソースコード

  1. unit VbLikeStringUtil;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   StrUtils,Types;  
  7.   
  8.   function JoinString(AStrings : Array of String; Delemeter: String) : String overload;  
  9.   function JoinString(AStrings : Array of String; Delemeter: String; AddLastDelemeter : Boolean) : String overload;  
  10.   
  11.   
  12. implementation  
  13.   
  14. uses  
  15.   SysUtils;  
  16.   
  17.   
  18. function JoinString(AStrings : Array of String; Delemeter: String) : String overload;  
  19. begin  
  20.   Result := JoinString(AStrings,Delemeter,false);  
  21. end;  
  22.   
  23. function JoinString(AStrings : Array of String; Delemeter: String; AddLastDelemeter : Boolean) : String overload;  
  24. var  
  25.   i : Longint;  
  26. begin  
  27.   
  28.   Result := '';  
  29.   if (Length(AStrings) > 0then  
  30.   begin  
  31.   
  32.     //最後の  
  33.     for i := low(AStrings) to high(AStrings)-1 do  
  34.     begin  
  35.       Result := Result + AStrings[i] + Delemeter;  
  36.     end;  
  37.   
  38.     //文字配列の最後の要素  
  39.     Result := Result + AStrings[high(AStrings)];  
  40.   
  41.     //最後にデリミターを付加する場合  
  42.     if AddLastDelemeter then  
  43.     begin  
  44.       Result := Result + Delemeter;  
  45.     end;  
  46.   
  47.   end;  
  48. end;  

でテストコードはこんな感じ。

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     Label1: TLabel;  
  13.     Button2: TButton;  
  14.     procedure Button1Click(Sender: TObject);  
  15.     procedure Button2Click(Sender: TObject);  
  16.   private  
  17.     { Private 宣言 }  
  18.   public  
  19.     { Public 宣言 }  
  20.   end;  
  21.   
  22. var  
  23.   Form1: TForm1;  
  24.   
  25. implementation  
  26.   
  27. uses  
  28.   StrUtils,Types, VbLikeStringUtil;  
  29.   
  30. {$R *.dfm}  
  31.   
  32. procedure TForm1.Button1Click(Sender: TObject);  
  33. var  
  34.   JoinItems : TStringDynArray;  
  35. begin  
  36.   
  37.   
  38.   SetLength(JoinItems,5);  
  39.   
  40.   JoinItems[0] := 'イージス';  
  41.   JoinItems[1] := 'ジャスティス';  
  42.   JoinItems[2] := 'ザク';  
  43.   JoinItems[3] := 'セイバー';  
  44.   JoinItems[4] := 'グフ';  
  45.   
  46.   Assert('イージス|ジャスティス|ザク|セイバー|グフ'=JoinString(JoinItems,'|'));  
  47.   
  48.   Label1.Caption := JoinString(JoinItems,'|');  
  49.   
  50.   
  51.   
  52. end;  
  53.   
  54. procedure TForm1.Button2Click(Sender: TObject);  
  55. begin  
  56.   
  57.   //空配列の場合は空文字を返す  
  58.   Assert(''=JoinString([],'|'));  
  59.   
  60.   //通常の場合  
  61.   Assert('ミリアリア|キラ|メイリン|バルトフェルド'  
  62.      = JoinString(['ミリアリア','キラ','メイリン','バルトフェルド'],'|'));  
  63.   
  64.   //オプションの第3引数にTrueを指定すると文字列の最後にデリミタを付加します。  
  65.   Assert('ミリアリア|キラ|メイリン|バルトフェルド|'  
  66.      = JoinString(['ミリアリア','キラ','メイリン','バルトフェルド'],'|',true));  
  67.   
  68.   Label1.Caption := JoinString(['ミリアリア','キラ','メイリン','バルトフェルド'],'|',true);  
  69. end;  
  70.   
  71. end.  

ちなみに、今回の文字列は、Seedの自分の好きなキャラシリーズです。

1 件のコメント:

Delフサ さんのコメント...

こんにちはー。

Assertで空文字の場合の対応など書いていただけて、助かります。

overload もありますが、今回の件の場合だとデフォルト引数指定も使えますね。