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

假设,我有一个数组:

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

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

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

我怎么能这样做?

PS:是的,我知道这个和这个post,但它的解决方案不适用于一系列基元。

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


使用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, " - "); 

在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 

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

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

更准确地说,首先应该将数组包装到带有Arrays.asList()或Guava的原始友好等价物的List

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

我确信在Kotlin / Scala或其他JVM语言中有一种方法可以做到这一点,但你总是可以坚持使用上面的一小组值保持简单:

 int i, arrLen = arr.length; StringBuilder tmp = new StringBuilder(); for (i=0; i 

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

IntStream.of(arr).mapToObj(i – > String.valueOf(i))。collect(Collectors.joining(“,”));

我一直在寻找一种方法来在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));