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

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
2

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流:

像这样:

 

1
2
3
4

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

 

事实上,使用流实现结果有很多变化。

Java 8的方法EDCOX1(5)仅适用于字符串,因此,使用它仍然需要将EDCOX1的6度转换为EDCOX1(7)。

 

1
2

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

 

如果你坚持使用Java 7或更早的没有库,你可以编写你自己的实用方法:

 

1
2
3
4
5
6
7
8
9
10
11
12

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

 

比你能做的还多:

 

1
2

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

 相关讨论

 

  • 型您可以使用.collect(Collectors.joining(","))代替临时字符串数组。
  • 型很好的概述!对于Java 1.7版本:技术上,您不需要在循环之前需要ARR.LoS==1检查,但这也是完美的。
  • 型@Shmosel,不。Arrays.stream(arr)产生IntStream,其中没有这样的collect()方法。
  • 型@N247S,是的!已编辑。

 

 


在Java 8 +中,可以使用EDCOX1、10和EDCOX1 11。有点像

 

1
2
3
4

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

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

 相关讨论

 

  • 型很好!正如我所说,有很多方法可以通过流来实现这一点。

 

 

 

 


您可以使用guava来连接元素。你可以在那里找到更多的例子和文档。https://github.com/google/guava/wiki/stringsexplained网站

 

1
2

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

 

更准确地说,您应该首先将数组包装成一个List,使用Arrays.asList()或guava的原始友好等价物。

 

1
2
3
4
5

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

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

 相关讨论

 

  • 型对于基元数组,GAVA提供了基元.asList()方法,例如Ints.asList()—不能将Array.asList()用于基元数组。
  • 型好吧,我的错会纠正我自己
  • 型是的,Arrays.asList(arr)将生成一个大小为1=)的List,这是我们的原始数组。

 

 


我相信有一种方法可以用Kotlin/scala或其他JVM语言来实现这一点,但是对于上面提到的一小部分值,您可以始终坚持保持简单:

 

1
2
3
4
5
6
7

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


Java 8的解决方案是这样的:

 

1

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


我一直在寻找一种方法来连接流中的原语,而不需要先为它们中的每一个实例化字符串。我来这里了,但还是需要拳击他们。

 

1
2
3
4
5

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
2
3

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

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

 相关讨论

 

  • 型OP需要"—"作为分隔符

 

 


在Java8中,可以使用如下字符串类:

 

1

String joined = String.join(",", name);

 相关讨论

 

  • 型如果名字不是String就不能

阅读体验不佳可参考原文:https://www.codenong.com/38425623/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值