Java: join array of primitives with separator
假设我有一个数组:
1 | int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; |
我需要使用分隔符来连接它的元素,例如" -",因此我应该得到这样的字符串:
1 | "1 - 2 - 3 - 4 - 5 - 6 - 7" |
我怎么能这样做?
附言:是的,我知道这个和这个帖子,但是它的解决方案不能与一系列的原语一起工作。
这就是我想到的。有几种方法可以做到这一点,它们取决于您使用的工具。
使用来自普通语言的StringUtils和ArrayUtils:
1 | int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; |
您不能仅仅使用StringUtils.join(arr," -");,因为StringUtils没有重载版本的方法。不过,它有方法StringUtils.join(int[], char)。
在任何Java版本中工作,从1.2开始。
使用Java 8流:
像这样:
1 | int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; |
事实上,使用流实现结果有很多变化。
Java 8的方法EDCOX1(5)仅适用于字符串,因此,使用它仍然需要将EDCOX1的6度转换为EDCOX1(7)。
1 | String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new); |
如果你坚持使用Java 7或更早的没有库,你可以编写你自己的实用方法:
1 | public static String myJoin(int[] arr, String separator) { |
比你能做的还多:
1 | int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; |
相关讨论
- 型您可以使用.collect(Collectors.joining(","))代替临时字符串数组。
- 型很好的概述!对于Java 1.7版本:技术上,您不需要在循环之前需要ARR.LoS==1检查,但这也是完美的。
- 型@Shmosel,不。Arrays.stream(arr)产生IntStream,其中没有这样的collect()方法。
- 型@N247S,是的!已编辑。
在Java 8 +中,可以使用EDCOX1、10和EDCOX1 11。有点像
1 | int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 }; |
输出为(按要求)
1 | 1 - 2 - 3 - 4 - 5 - 6 - 7 |
相关讨论
- 型很好!正如我所说,有很多方法可以通过流来实现这一点。
您可以使用guava来连接元素。你可以在那里找到更多的例子和文档。https://github.com/google/guava/wiki/stringsexplained网站
1 | Joiner.on("-") |
更准确地说,您应该首先将数组包装成一个List,使用Arrays.asList()或guava的原始友好等价物。
1 | Joiner.on("-") |
相关讨论
- 型对于基元数组,GAVA提供了基元.asList()方法,例如Ints.asList()—不能将Array.asList()用于基元数组。
- 型好吧,我的错会纠正我自己
- 型是的,Arrays.asList(arr)将生成一个大小为1=)的List,这是我们的原始数组。
我相信有一种方法可以用Kotlin/scala或其他JVM语言来实现这一点,但是对于上面提到的一小部分值,您可以始终坚持保持简单:
1 | int i, arrLen = arr.length; |
Java 8的解决方案是这样的:
1 | Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-")) |
我一直在寻找一种方法来连接流中的原语,而不需要先为它们中的每一个实例化字符串。我来这里了,但还是需要拳击他们。
1 | LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> { |
1 | int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 }; |
相关讨论
- 型OP需要"—"作为分隔符
在Java8中,可以使用如下字符串类:
1 |
相关讨论
- 型如果名字不是String就不能
阅读体验不佳可参考原文:https://www.codenong.com/38425623/