Java:使用分隔符连接原始数组

43

假设我有一个数组:

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

我需要使用分隔符(例如 " - ")连接它的元素,因此我应该得到这样的字符串:

"1 - 2 - 3 - 4 - 5 - 6 - 7"
我该如何做到这一点?
PS:是的,我知道关于这个这个帖子,但它们的解决方案在原始数组中不起作用。
9个回答

88
这是我想出来的方案。有几种方法可以做到这一点,取决于你使用的工具。
使用Commons 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, " - ");

4
你可以使用 .collect(Collectors.joining(",")) 代替临时的字符串数组。 - shmosel
2
很好的概述!对于Java 1.7版本:从技术上讲,在循环之前不需要进行arr.length == 1检查,但这也完全可以正常工作。 - n247s
@shmosel,不是的。Arrays.stream(arr) 生成一个 IntStream,其中没有 collect() 方法。 - spirit

15

Java 8的解决方案如下:

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

12

在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

好的!就像我说的,有很多种通过流来完成这个任务的方法。 - spirit

5

2
对于原始数组,Java提供了原始的.asList()方法,例如Ints.asList() - 您不能使用Array.asList()来处理原始数组。 - dimo414
没错,Arrays.asList(arr) 会生成一个大小为1的 List =) 这个列表中唯一的元素就是我们的原始数组。 - spirit

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

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

OP想要“ - ”作为分隔符。 - Hulk

2

我相信在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

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

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

然而,如果分隔符是一个字符串,你应该使用另一种方法,因为StringUtils表现不佳(请参见此票据)。


1

我一直在寻找一种方法,在不首先为每个基元类型实例化字符串的情况下加入流中的基元类型。我已经做到了这一点,但仍需要将它们装箱。

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
对于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]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接