トップ «前の日記(2011-01-19) 最新 次の日記(2011-01-21)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2011-01-20

_ カンマ区切りの作成

今、文字列の配列 array = { "a", "b", "c" ... "z" }があって、ここから、"a, b, c, ..., y, z"というカンマ区切りの文字列を作るとする。

C#なら、何も考えなくとも、string.Join(", ", array);で出来てしまうが、Javaには今のところそういうメソッドはStringにもArraysにもない。この2つになければきっとないだろうと思う。

C#だって、zipしながらじゃできないのではなかろうか。と思ってSystem.Arrayクラスを眺めていたらAsReadOnlyっていう便利なやつがあるんだな。気付かなかった。後で試してみよう。

で、最近はString#+が賢くなったので、StringBufferとかStringBuilderとかをあまり使わないような気がするのだが、カンマ結合のときは、非常に便利なので良く使う。

というのは、

String[] a = new String[] { "a", "b", .... };
String cvs = "";
for (String s : a) {
  if (cvs.length() != 0) {
      cvs += ", ";
  }
  cvs += s;
}

みたいな、どうでも良いループの中で、たった1回切りしか意味がない条件節を入れるのが不快だからだ。無駄なことこのうえない。

それに対してStringBuilderみたいなものを使えば、安価に記述できる。

String[] a = new String[] { "a", "b", .... };
StringBuilder cvs = new StringBuilder();
for (String s : a) {
  cvs.append(s).append(", ");
}
cvs.setLength(cvs.length() - 2); // もちろん最低でも1要素は存在する前提。0要素があるなら、ここでcvs.length > 0 すれば良い(ループの外に条件節を入れるのは不快ではない)

でも、最近、別解もあるなぁと、少なくともSQLを文字列組立しているときは思う(が、上のように書くので通常は使わない)。

String[] a = new String[] { "a", "b", .... };
StringBuilder sql = new StringBuilder("select ");
for (String s : a) {
  sql.append(s).append(", ");
}
sql.append(" 0 as DUMMY from ").append(TABLE_NAME);

カンマが余分なら、要素を追加してやれば良いのであった。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|

ジェズイットを見習え