【问题标题】:How do I turn a Set<String> into a string in Java? [duplicate]如何在 Java 中将 Set<String> 转换为字符串? [复制]
【发布时间】:2021-09-30 08:39:37
【问题描述】:

我有一组字符串:

Set<String> mySet = new HashSet<String>();
    
hs.add("how");
hs.add("are");
hs.add("you");

我想把这个集合变成一个字符串,但是有两个规则:

  1. ":*" 应添加为每个单词的后缀
  2. 单词应该用竖线分隔|

像这样:

"how:*|are:*|you:*"

最简单的方法是什么?

这是我迄今为止尝试过的:

StringBuilder sb = new StringBuilder();

for (String word : search) {
    sb.append(word);
    sb.append(":*|");
}

这样做的问题是它最后给出了一个额外的管道:

"how:*|are:*|you:*|"

我当然可以删除最后一个字符,但如果可能的话,我正在寻找一种更简单的方法。

【问题讨论】:

  • 到目前为止你尝试过什么方法?请给我看看好吗?
  • 你有没有尝试过?既然你标记了StringBuilder,看来你已经有了一个想法?
  • 流,映射 x -> x + ":*",收集加入 '|'
  • @deHaar 我已经更新了帖子。
  • 具体来说,流解决方案适用于所有集合 - 例如带有Collector.joining,允许指定分隔符、前缀和后缀。

标签: java string set stringbuilder


【解决方案1】:

如果您使用的是 Java 8 或更高版本,那么String#join 是一种选择。但是,您应该使用有序集合来确保字符串以您想要的顺序出现:

List<String> myList = Arrays.asList(new String[] { "how", "are", "you" });
String output = String.join(":*|", myList) + ":*";
System.out.println(output);  // how:*|are:*|you:*

您透露您正在尝试构建一个正则表达式替换来在您的数据库中搜索一个术语。如果是这样,那么您应该使用这种模式:

.*\b(?:how:|are:|you:).*

如果 API 接受仅匹配列的一部分的模式,则前导和尾随 .* 可能是可选的。以下是生成此模式的更新 Java 代码:

List<String> myList = Arrays.asList(new String[] { "how", "are", "you" });
StringBuilder sb = new StringBuilder();
sb.append(".*\\b(?:").append(String.join(":|", myList)).append(":).*");
System.out.println(sb.toString);  // .*\b(?:how:|are:|you:).*

【讨论】:

  • @Ben 虽然要小心,但您使用的是 HashSet。不能保证你会看到“你好吗”,你可能会看到“你现在怎么样”、“你怎么样”、“你怎么样”......如果你的话,蒂姆的答案会更好地应用于链接哈希集关心广告订单。
  • 完美,有效。顺序无关紧要。我正在使用字符串在数据库中的列中进行搜索。只要它包含这些词,顺序无关紧要..非常感谢。
  • @Ben 检查更新的答案,了解您应该在这里做什么。使用关键字的交替,在交替的两边都有单词边界。前导和尾随 .* 是可选的,前提是您调用的正则表达式 API 可以处理部分匹配。
【解决方案2】:

只看最后的管道问题,您可以将其视为在除第一个单词之外的每个单词之前添加之前的内容。识别第一个元素通常比识别最后一个元素更容易。

这是一小段伪代码来展示这个想法:

separator = "|"
firstWord <– true
for each word in source {
  if (firstWord) {
    firstWord <– false
  } else {
    outString.append(separator)
  }
  outString.append(word + ";*)
}

【讨论】:

  • 我完全明白,但这正是我想要避免的。我可以在一行中完成所有这些: String.join(":*|", search) + ":*";
  • 我明白你在说什么,但这正是我试图避免的。我想要一个简单的解决方案。所以蒂姆建议用一条线来完成所有这些String.join(":*|", mySet) + ":*";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2022-01-05
  • 2021-07-12
相关资源
最近更新 更多