检查一个字符串是否包含另一个字符串两次

5

我有一个for循环,它遍历一个maplist,现在我想检查maplist的每个条目是否包含一个特定的字符串超过一次,然后删除除第一次出现的所有字符串外的所有字符串,但我不知道如何做。

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);
    }
}

我对每一个想法都心存感激。


3
是准确的两倍还是至少两倍? - user6073886
好问题:至少两次。 - Mad Scientist
你可以使用“Pattern”和“Matcher”查找字符串的所有匹配项,并用空字符串“”替换除第一个之外的所有内容。 - Thomas
2
另一个问题:它只是一个“特定”的字符串,还是任何重复的字符串?您的问题似乎表明您可能会输入如"a|b|c|a|d|c"这样的内容 - 您想要删除第二个a还是也删除第二个c?为了更容易理解您的要求,您可以提供一些示例吗? - Thomas
我想要删除任何重复的内容,包括第二个c。 - Mad Scientist
好的,如果是这样的话(我猜测因为我不确定我完全理解你的要求):将字符串拆分,将元素放入LinkedHashSet中并从中重建字符串。元素的顺序将被保留,任何重复的元素都将被忽略。 - Thomas
3个回答

3

根据您的评论,我假设您的要求如下:

  • 您有一个包含多个由管道字符|分隔的部分的字符串,例如"a|e|b|c|a|c|a|d"
  • 您想删除所有重复的字符串,同时保留元素的顺序,例如您想要"a|e|b|c|d"

为了实现这一点,您可以在管道处拆分字符串,将元素收集到LinkedHashSet中,并使用管道重新连接元素。

使用Java 8的示例:

//The pipe needs to be escaped because split() interprets the input as a regex
Set<String> elements = new LinkedHashSet<>( Arrays.asList( input.split( "\\|" ) ) );
//rejoin using the pipe
String output = elements.stream().collect( Collectors.joining( "|" ) );

2

要检查key是否至少包含一个字符串s两次,并删除第二次出现的字符串,可以使用indexOf两次,第二次调用从第一次出现后开始搜索:

最初的回答:

Use indexOf twice to check if a string s appears at least twice in key, and remove the second occurrence by starting the second search after the first occurrence.

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
}

Test

System.out.println(removeSecond("mississippi", "ss")); // prints: missiippi
System.out.println(removeSecond("mississippi", "i"));  // prints: missssippi
System.out.println(removeSecond("mississippi", "pp")); // prints: mississippi

更新

如果你想要删除所有的重复内容,即只保留第一次出现的内容,请继续查找。为了获得构建新字符串的最佳性能,请使用 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());
}

Test

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

1
如果您想删除除第一个以外的所有出现次数:
public static String removeExceptFirst(String master, String child) throws Exception {
    int firstIndex = master.indexOf(child);
    int lastIndexOf = master.lastIndexOf(child);
    if (firstIndex == lastIndexOf) {
        if (firstIndex == -1) {
            throw new Exception("No occurrence!");
        } else {
            throw new Exception("Only one occurrence!");
        }
    }

    while (true) {
        firstIndex = master.indexOf(child);
        lastIndexOf = master.lastIndexOf(child);
        if (firstIndex == lastIndexOf) {
            return master;
        }
        master = master.substring(0, lastIndexOf) + master.substring(child.length() + lastIndexOf);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接