Java:使用分隔符连接基元数组

时间:2016-07-17 20:25:01

标签: java arrays join separator

假设我有一个数组:

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

我需要使用分隔符加入其元素,例如" - ",因此我应该得到这样的字符串:

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

我怎么能这样做?

PS:是的,我知道thisthis帖子,但其解决方案不适用于基元数组。

9 个答案:

答案 0 :(得分:53)

我想出了什么。有几种方法可以做到这一点,它们取决于您使用的工具。

使用Common Lang中的StringUtilsArrayUtils

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

您不能只使用StringUtils.join(arr, " - ");,因为StringUtils没有重载版本的方法。但是,它有方法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, " - ");

答案 1 :(得分:8)

在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

答案 2 :(得分:4)

您可以使用Guava加入元素。您可以在那里找到更多示例和文档。 https://github.com/google/guava/wiki/StringsExplained

Joiner.on("-")
      .join(texts);

更准确地说,首先应将数组包装成List Arrays.asList()或番石榴primitive-friendly等效。

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

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

答案 3 :(得分:2)

我确信有一种方法可以在Kotlin / Scala或其他JVM语言中执行此操作,但您可以始终坚持为上面的一小组值保持简单:

tensorflow.learn

答案 4 :(得分:1)

我一直在寻找一种在Stream中加入基本体的方法,而无需首先实例化每个基本体的字符串。我来了,但是仍然需要把它们装箱。

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));

答案 5 :(得分:1)

Java 8解决方案如下:

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

答案 6 :(得分:1)

如果分隔符是单个字符,则可以使用Common Lang中的StringUtils

int[] arr = {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(arr, '-');

但是,如果定界符是String,则应使用替代方法,因为StringUtils表现不佳(see this ticket)。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

对于Java 7或更早版本。

public static StringBuilder join(CharSequence delimiter, int... arr) {
    if (null == delimiter || null == arr) throw new NullPointerException();

    StringBuilder sb = new StringBuilder(String.valueOf(arr[0]));
    for (int i = 1; i < arr.length; i++) sb.append(delimiter).append(arr[i]);

    return sb;
}

public static void main(String[] args) {
    StringBuilder sb = join(" - ", 1, 2, 3, 4);
    System.out.println(sb.toString());//you could pass sb also coz println automatically call toString method within it
    System.out.println(sb.insert(0, "[").append("]"));
}
  

输出:

     

1-2-3-4

     

[1-2-3-4]