gpt4 book ai didi

java - 加入具有不同最后定界符的字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:38:14 28 4
gpt4 key购买 nike

使用 stream.collect(Collectors.joining(", ")) 我可以很容易地加入我的流中用逗号分隔的所有字符串。可能的结果是 "a, b, c"。但是,如果我希望最后一个分隔符不同怎么办。例如 "和 " 这样我得到 "a, b and c" 作为结果。有简单的解决方案吗?

最佳答案

如果它们已经在列表中,则不需要流;只需加入除最后一个元素之外的所有子列表,并连接另一个定界符和最后一个元素:

int last = list.size() - 1;
String joined = String.join(" and ",
String.join(", ", list.subList(0, last)),
list.get(last));

这是使用 Collectors.collectingAndThen:

执行上述操作的版本
stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningLastDelimiter(", ", " and ")));

public static Function<List<String>, String> joiningLastDelimiter(
String delimiter, String lastDelimiter) {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join(delimiter, list);
return String.join(lastDelimiter,
String.join(delimiter, list.subList(0, last)),
list.get(last));
};
}

此版本还可以处理流为空或只有一个值的情况。感谢 Holger 和 Andreas 提出的极大改进此解决方案的建议。

我曾在评论中建议牛津逗号可以通过使用 "、""和" 作为分隔符来完成,但这会产生不正确的结果"a, and b" 的两个元素,所以为了好玩这里有一个正确使用牛津逗号的元素:

stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningOxfordComma()));

public static Function<List<String>, String> joiningOxfordComma() {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join("", list);
if (last == 1) return String.join(" and ", list);
return String.join(", and ",
String.join(", ", list.subList(0, last)),
list.get(last));
};
}

关于java - 加入具有不同最后定界符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34936771/

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