gpt4 book ai didi

Java String.join 还要在末尾添加分隔符

转载 作者:行者123 更新时间:2023-12-04 12:07:49 24 4
gpt4 key购买 nike

我有数组 ["a", "b", "c"]我想将它们连接在一起形成“a#b#c#”。 String.join 只会让我“a#b#c”。我不能只是做 str += "#"要么是因为这很慢(Java 必须创建一个新字符串才能做到这一点)。因此,我必须使用 StringBuilder 重写整个内容。 . Java 是否有一些方法基本上是 String.join,但还将分隔符附加到末尾?
对于更多的上下文,我正在尝试使用一组字符串创建一个后缀数组数据结构,因此这部分实际上是一个瓶颈。

最佳答案

您可以使用 Stream API Collectors.joining() 有这样的前缀和后缀参数:

    Stream.of("a", "b", "c")
.collect(Collectors.joining("#", "", "#"));
其中加入参数分别是定界符、前缀、后缀。
此外,您可以像上面评论中的@Wander Nauta 所说的那样,将一个空字符串添加到您的数组中
我已经启动了 JMH,并重现了写的性能差异
bellow :
public class Benchmarks {

private static final String[] arr = {"a", "b", "c"};

@Benchmark
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(value = 1, warmups = 1)
@BenchmarkMode(Mode.AverageTime)
public String joinAndConcat() {
return String.join("#", arr) + "#";
}

@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public String streamsJoining() {
return Stream.of(arr)
.parallel()
.collect(Collectors.joining("#", "", "#"));
}

@Benchmark
@Fork(value = 1, warmups = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public String stringJoiner() {
StringJoiner joiner = new StringJoiner("#", "", "#");
for (String el : arr) {
joiner.add(el);
}
return joiner.toString();
}
}
结果:
> Benchmark                  Mode  Cnt   Score   Error  Units
> Benchmarks.joinAndConcat avgt 5 46,670 ± 0,139 ns/op
> Benchmarks.streamsJoining avgt 5 73,336 ± 0,180 ns/op
> Benchmarks.stringJoiner avgt 5 27,236 ± 0,386 ns/op
但你必须明白 46 nSec对于大多数应用程序来说是一个非常小的差异。

关于Java String.join 还要在末尾添加分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68423505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com