问题描述
我有一组字符串:
Set<String> mySet = new HashSet<String>();
hs.add("how");
hs.add("are");
hs.add("you");
我想把这个集合变成一个字符串,但是有两个规则:
- ":*" 应该作为后缀添加到每个单词
- 单词应该用竖线分隔|
像这样:
"how:*|are:*|you:*"
最简单的方法是什么?
这是我迄今为止尝试过的:
StringBuilder sb = new StringBuilder();
for (String word : search) {
sb.append(word);
sb.append(":*|");
}
这样做的问题在于它最终会提供一个额外的管道:
"how:*|are:*|you:*|"
我当然可以删除最后一个字符,但如果可能,我正在寻找一种更简单的方法。
解决方法
如果您使用的是 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","you" });
StringBuilder sb = new StringBuilder();
sb.append(".*\\b(?:").append(String.join(":|",myList)).append(":).*");
System.out.println(sb.toString); // .*\b(?:how:|are:|you:).*
,
只看最后管道的问题,您可以将其视为在除第一个之外的每个单词之前添加 的内容。识别第一个元素通常比识别最后一个元素更容易。
这是一小段伪代码来展示这个想法:
separator = "|"
firstWord <– true
for each word in source {
if (firstWord) {
firstWord <– false
} else {
outString.append(separator)
}
outString.append(word + ";*)
}