当前位置: 首页 > 面试题库 >

连接具有不同最后定界符的字符串

阎安邦
2023-03-14
问题内容

使用stream.collect(Collectors.joining(", "))I,可以轻松地连接流中所有用逗号分隔的字符串。可能的结果是"a, b, c"。但是,如果我希望最后一个定界符不同,该怎么办。例如," and "使我得到"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的建议,这些建议极大地改善了此解决方案。

我曾在评论中建议,可以使用", "", and"作为定界符来完成牛津逗号,但是"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));
            };
}


 类似资料:
  • 问题内容: 我尝试将字符串拆分为令牌。 标记定界符不是单个字符,有些定界符包含在其他定界符中(例如&和&&),我需要将定界符作为标记返回。 StringTokenizer无法处理多个字符定界符。我认为String.split可以实现,但是无法猜测出适合我需要的神奇正则表达式。 任何想法 ? 例: -–编辑— 感谢所有人的帮助,Dasblinkenlight为我提供了解决方案。这是我在他的帮助下编写

  • 问题内容: 我有包含例如的数据帧: 我需要删除(包括)两个::的所有内容,以便最终得到: 我尝试了str.trim(似乎不存在)和str.split,但没有成功。最简单的方法是什么? 问题答案: 您可以像平常一样使用。只需对string进行拆分,并索引从该方法创建的列表: 这是一个非熊猫解决方案: 编辑:这是上面发生的情况的分步说明: 我建议您查看pandas.Series.str文档,或者更好的

  • 问题内容: 我在玩python,我意识到我们不需要使用’+’运算符来连接字符串,除非它与值一起使用。 例如: 现在我有两个问题: 为什么语句3无效,而语句1无效? 陈述1和2之间是否存在技术上的差异,例如计算速度等? 问题答案: 从文档: 允许使用可能使用不同的引用约定的多个相邻字符串文字(由空格分隔),其含义与它们的串联相同。因此,“ hello”“世界”等同于“ helloworld”。 语句

  • 问题内容: 我需要正则表达式的帮助来解决以下问题: 我有一个字符串,例如“ 1£23 $ 456 $£$” 当我拆分它时,我希望字符串数组中的输出包含: 有人对如何最好地解决这个问题有任何想法吗?该解决方案需要满足以下附加要求: 也各执分隔符:,,,和 非定界符字符只是在定界符前带有可选空格的数字。 任何此类空格都是值的一部分,而不是分隔符本身。 问题答案: 使用更强大的功能代替。下面的代码应该可

  • 问题内容: 用Java编写一个函数,该函数接受一个字符串数组,并且从字符串数组中仅返回那些具有重复的特定字母的字符串,例如:如果I / P为 那么O / P应该是 我可以使用解决 IS 没有使用正则表达式的方式 ,使之短? 问题答案: 您可以使用反向引用: 通过Debuggex进行可视化 Java示例: 印刷品:

  • 问题内容: 在JavaScript中,我有一个包含许多迭代的循环,并且在每个迭代中,我正在创建一个包含许多运算符的巨大字符串。有没有更有效的方式来创建字符串?我正在考虑创建一个动态数组,在该数组中不断向其中添加字符串,然后进行联接。谁能解释并举例说明最快的方法吗? 问题答案: 基于JSPerf的基准测试,似乎是使用最快的方法,尽管不一定在每个浏览器中都使用。 为了在DOM中构建字符串,最好先将字符