【问题标题】:Check if a string contains another string twice检查一个字符串是否包含另一个字符串两次
【发布时间】:2019-08-01 08:30:00
【问题描述】:

我有一个 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);
    }
}

我感谢每一个想法。

【问题讨论】:

  • 正好两次或至少两次?
  • 好问题:至少两次
  • 嗯,您可以使用PatternMatcher 查找字符串的所有匹配项,并将除第一个之外的所有匹配项替换为空字符串""
  • 另一个问题:它只是一个某些字符串还是任何重复的字符串?您的问题似乎表明您可以输入"a|b|c|a|d|c" 之类的输入 - 您想只删除第二个a 还是同时删除第二个c?为了更容易理解您的要求,您能否提供一些示例?
  • 我想删除所有重复项,所以第二个 c 也是如此

标签: java string list


【解决方案1】:

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

  • 您的字符串包含由管道字符| 分隔的多个部分,例如"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 两次,第二次调用在第一次出现后开始搜索:

    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
    }
    

    测试

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

    测试

    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
    

    【讨论】:

      【解决方案3】:

      如果要删除除第一个以外的所有匹配项:

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

      【讨论】:

        猜你喜欢
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多