web-dev-qa-db-ja.com

Java:プリミティブの配列をセパレーターで結合する

配列があるとします:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};

そして、セパレータを使用して要素を結合する必要があります。たとえば、" - "、結果として、次のような文字列を取得する必要があります。

"1 - 2 - 3 - 4 - 5 - 6 - 7"

どうすればこれができますか?

PS:はい、 this および this 投稿しますが、そのソリューションはプリミティブの配列では機能しません。

23
spirit

ここで私が思いついたもの。これにはいくつかの方法があり、使用するツールによって異なります。


Common Lang からのStringUtilsおよびArrayUtilsの使用:

_int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
_

StringUtilsにはメソッドのオーバーロードバージョンがないため、StringUtils.join(arr, " - ");を使用することはできません。ただし、メソッドはStringUtils.join(int[], char)です。

どのバージョンでも動作しますJavaバージョン1.2以降。


Java 8ストリームを使用:

このようなもの:

_int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
        .mapToObj(String::valueOf)
        .collect(Collectors.joining(" - "));
_

実際、ストリームを使用して結果を得るには多くのバリエーションがあります。

Java 8のメソッドString.join()は文字列でのみ機能するため、使用するには、_int[]_を_String[]_に変換する必要があります。

_String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
_

ライブラリなしでJava 7以前を使用している場合は、独自のユーティリティメソッドを記述できます。

_public static String myJoin(int[] arr, String separator) {
    if (null == arr || 0 == arr.length) return "";

    StringBuilder sb = new StringBuilder(256);
    sb.append(arr[0]);

    //if (arr.length == 1) return sb.toString();

    for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);

    return sb.toString();
}
_

あなたができるより:

_int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
_
56
spirit

Java 8+では、 IntStreamStringJoiner を使用できます。

int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());

出力は(要求どおり)

1 - 2 - 3 - 4 - 5 - 6 - 7
9
Elliott Frisch

要素の結合にGuavaを使用できます。あなたがそこに見つけることができるより多くの例とドキュメント。 https://github.com/google/guava/wiki/StringsExplained

_Joiner.on("-")
      .join(texts);
_

より正確にするには、まず、配列を Arrays.asList() またはGuavaの primitive-friendly と同等のListにラップする必要があります。

_Joiner.on("-")
      .join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));

Joiner.on("-")
      .join(Ints.asList(arr));
_
4
RMachnik

Kotlin/Scalaまたは他のJVM言語でもこれを行う方法があると確信していますが、上記のような小さな値のセットについては常に物事をシンプルに保つことに固執することができます:

int i, arrLen = arr.length;
 StringBuilder tmp = new StringBuilder();
 for (i=0; i<arrLen-1; i++)
    tmp.append(arr[i] +" - ");
 tmp.append(arr[arrLen-1]);

 System.out.println( tmp.toString() );
2
engAnt

Java 8ソリューションは次のようになります。

Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))
1
user2935131

私は、それぞれの文字列を最初にインスタンス化せずに、ストリーム内のプリミティブを結合する方法を探していました。私はこれに来ましたが、それでもそれらをボクシングする必要があります。

LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
    if (sb.length() != 0)
        sb.append(',');
    sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));
1
bourne2program
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };

IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;
0
Lin W