我有一个 for 循环,它遍历映射列表,现在我想检查映射列表的每个条目是否多次包含某个字符串,然后删除除第一个出现的字符串之外的所有字符串,但我不知道该怎么做。
for (Map<String, String> entry : mapList) {
String line = "";
for (String key : entry.keySet()) {
if (StringUtils.containsAny(key, "5799"){
line += entry.get(key) + "|";
}
list1.add(line);
}
}
Run Code Online (Sandbox Code Playgroud)
我感谢每一个想法。
要查看是否key包含字符串s至少两次,并删除第二次出现,请使用indexOf两次,第二次调用在第一次出现后开始搜索:
static String removeSecond(String key, String s) {
int idxFirst = key.indexOf(s);
if (idxFirst != -1) {
int idxSecond = key.indexOf(s, idxFirst + s.length());
if (idxSecond != -1) {
return key.substring(0, idxSecond) +
key.substring(idxSecond + s.length());
}
}
return key; // Nothing to remove
}
Run Code Online (Sandbox Code Playgroud)
测试
System.out.println(removeSecond("mississippi", "ss")); // prints: missiippi
System.out.println(removeSecond("mississippi", "i")); // prints: missssippi
System.out.println(removeSecond("mississippi", "pp")); // prints: mississippi
Run Code Online (Sandbox Code Playgroud)
更新
如果您想删除所有重复项,即仅保留第一个出现的项,请继续搜索。为了获得构建新字符串的最佳性能,请使用StringBuilder.
static String removeDuplicates(String key, String s) {
int idx = key.indexOf(s);
if (idx == -1)
return key; // Nothing to remove
StringBuilder buf = new StringBuilder();
int prev = 0;
for (int start = idx + s.length(); (idx = key.indexOf(s, start)) != -1; prev = start = idx + s.length())
buf.append(key.substring(prev, idx));
return (prev == 0 ? key : buf.append(key.substring(prev)).toString());
}
Run Code Online (Sandbox Code Playgroud)
测试
System.out.println(removeDuplicates("mississippi", "ss")); // prints: missiippi
System.out.println(removeDuplicates("mississippi", "i")); // prints: misssspp
System.out.println(removeDuplicates("mississippi", "s")); // prints: misiippi
System.out.println(removeDuplicates("mississippi", "ab")); // prints: mississippi
Run Code Online (Sandbox Code Playgroud)