PHPのimplode関数をJavaで実装


概要

PHPのimplode関数のようなものをJavaで実装しました。

(追記) Java8にはjoinという関数があるそうです。
@nishemon さんコメントありがとうございます!

実装

/**
 * Join list elements with a string
 *
 * @param stringList The list of strings to implode.
 * @param glue The String for joining list.
 * @return Returns a string containing a string representation of all the list elements
 *          in the same order, with the glue string between each element.
 */
public static String implode(List<String> stringList, String glue) {
    StringBuilder stringBuilder = new StringBuilder();
    int index = 0;
    int size = stringList.size();

    for (String value : stringList) {
        stringBuilder.append(value);

        if (index < size - 1) {
            stringBuilder.append(glue);
        }

        index++;
    }

    return stringBuilder.toString();
}

(追記)汎用的な実装を教えていただきました。
@shiracamus さんコメントありがとうございます!

public static String implode(Iterable<? extends CharSequence> values, CharSequence glue) {
    StringBuilder buffer = new StringBuilder();
    CharSequence separator = "";
    for (CharSequence value : values) {
        buffer.append(separator).append(value);
        separator = glue;
    }
    return buffer.toString();
}

(追記)またまた実装を教えていただきました。
@saka1029 さんコメントありがとうございます!

public static <T> String implode(List<T> list, String glue) {
    StringBuilder sb = new StringBuilder();
    for (T e : list) {
        sb.append(glue).append(e);
    }
    return sb.substring(glue.length());
}

テスト

とりあえず簡単なのを一個だけ

@Test
public void testImplode() {
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");

    String glue = " ";
    String actual = Util.implode(list, glue);

    String expected = "A B C";
    assertEquals(expected, actual);
}

PHPのimplode()について

PHPのマニュアルを見ると、以下のように書いてあります。

注意:
implode()は、歴史的な理由により、引数をどちら の順番でも受けつけることが可能です。しかし、 explode() との統一性の観点からは、 ドキュメントに記述された引数の順番を使用する方が混乱が少なくなるでしょう。

また、PHPだとglueのデフォルトは空文字列なのですが今回は考慮していません。
やるとしたらこんな感じにオーバーロードしたものを作るのもいいかもしれません。

public static String implode(List<String> stringList) {
    return implode(stringList, "");
}

補足

間違っているところやもっといいやり方あったら教えてください!

参考