凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46968
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

最後のカンマより。
配列の最後にカンマをつけてもつけなくてもよいというマニアックな言語仕様についての話題です。 どうやらC言語からの伝統らしく、C言語系の表記を受け継いでいるJavaでもこの仕様は存在します。
具体的なコードを見た方が分かりやすいですね。

int[] intArray = new int[]{
  1,
  2,
  3,
};

この最後の"3,"の部分に注目。このカンマがあってもなくても、配列の大きさは3になります。 ちなみに、"3,,""とするとエラーとなります。最後の1個だけOKというわけです。

なんだかややこしい仕様のように思えますね…。

カンマで区切って出力するプログラム

ちょっと遠回りになりますが、まずはカンマで区切って数字を書き出すプログラムを考えて見ましょう。
"1,2,3"という文字を書き出そうとする場合、

public void hoge() {
  final int MAX = 3;
  for (int i=0; i<MAX; i++) {
    System.out.print(i);
    if (i < MAX -1) {
      System.out.print(",");
    }
  }
}

というように、最後の1個だけカンマを出力しないようにするか、

public void hoge() {
  final int MAX = 3;
  for (int i=0; i<MAX; i++) {
    if (i != 0) {
      System.out.println(",");
    }
    System.out.println(i);
  }
}

といったように、最初の1個だけ、前にカンマをつけないというプログラムにする必要があります。

N個の要素に対して、区切りはN-1個になるのです。このずれが非常にプログラムしにくい。

囲うなら簡単

要素と要素をカンマで区切って表現するのは面倒でした。ではプログラムにとって簡単な表現方法は何でしょうか?
要素を何かで囲うというがプログラム的に処理のしやすい記述方法となります。

public void hoge() {
  final int MAX = 3;
  for (int i=0; i<MAX; i++) {
    System.out.print("[");
    System.out.print(i);
    System.out.print("]");
  }
}

上記コードは"[1][2][3]"と出力するわけですが、このように何かで囲うという表現形式だと、 カンマ区切りのように条件分岐をする必要がありません。非常にすっきりと記述できますね。

さて、囲うということは要素の前と後ろに何かをくっつけるという処理になりますが、何をくっつけるかは自由に選べます。
ここで、前には何もつけず、後ろにはカンマを付けるという方法を選んでみましょう。

public void hoge() {
  final int MAX = 3;
  for (int i=0; i<MAX; i++) {
    System.out.print(i);
    System.out.print(",");
  }
}

ほら、"1,2,3,"になりましたね。この表記法はカンマで区切っているのではないのです。
空白とカンマで囲っているのです。

投稿日時 : 2007年10月27日 12:12
コメント
  • # re: 区切るというのは面倒
    かつのり
    Posted @ 2007/10/27 14:25
    後ろに区切りをつけない出力を行うなら、自分の場合、

    String delim = "";
    StringBuilder builder = new StringBuilder();
    for(String str : args){
    builder.append(delim);
    builder.append(str);
    delim = ",";
    }

    という感じ。ifがなくなるので楽ですよ。
  • # re: 区切るというのは面倒
    Blue
    Posted @ 2007/10/27 14:40
    単に

    int size = args.length();
    string str;

    if (size > 0)
    {
    str = args[0];
    for (int i = 1; i < size; i++)
    {
    str += "," + args[i];
    }
    }

    見たいのではどうでしょうか?
  • # ひと区切りつけましょう
    凪瀬 Blog
    Posted @ 2007/10/28 12:13
    ひと区切りつけましょう
  • # re: 区切るというのは面倒
    裏口
    Posted @ 2007/10/29 16:54
    休日は訪問してませんので亀レス・・・。

    むかーしCOBOLで同様のことやりましたが、IF使わずに姑息な対応しました。
    設定は普通にやりますが、出力時に最後のカンマを省くため1バイト短くするだけwww
    # 個人的にはアリだと思いますけど・・・ダメ?
タイトル
名前
Url
コメント