【问题标题】:How to check String contains one of Strings in collection如何检查字符串是否包含集合中的字符串之一
【发布时间】:2019-05-19 14:48:55
【问题描述】:

我想检查目标字符串是否包含集合中的字符串。并匹配最长的一个。例如。

目标字符串:str = "eignelaiwgn"

集合字符串:eigaebeigneeignep

结果需要eigne

首先我想到了HashMap,但它没有排序。所以我尝试将集合字符串放入ArrayList,然后用字符串长度对列表进行排序。然后使用for each循环检查

if ( str.contains("eigne") )

这需要每次循环列表。有没有更好(更快)的方法来实现这一目标?

【问题讨论】:

  • 您可以在对Arraylist进行排序后使用二进制搜索技术在log(n)时间内找到解决方案
  • @Lemmy ,可能不是。我想检查目标字符串是否包含集合中的字符串。如果集合包含目标字符串,则不会。

标签: java string collections


【解决方案1】:

您可以使用 Java 中 StringUtils 类的 LevensteinDistance() 方法,它会告诉您将一个字符串更改为另一个字符串所需的更改次数。您可以打印所需更改最少的字符串,这就是您的答案。看这个文件->LevenshteinDistance

同时寻找同一类的差异方法,这将告诉两个字符串之间的差异。

【讨论】:

    【解决方案2】:

    您也可以使用 TreeSet

    String str = "eignelaiwgn";
    // Assuming that the 'sub-strings' are stored in a list
    List<String> myList = Arrays.asList("eig", "a", "eb", "eigne", "eignep");
    
    // Create a TreeSet that sorts based on descending order of length
    Set<String> treeSet = new TreeSet<>((a, b) -> b.length() - a.length());
    treeSet.addAll(myList);
    
    String containsSub = treeSet.stream().filter(e -> str.contains(e))
                                .findFirst()
                                .orElse("Not found");
    

    现在我们遍历TreeSet 并找到子字符串出现在原始字符串中的第一个。现在由于TreeSet是按长度降序排序的,所以迭代将从最高到最低开始。

    【讨论】:

    • 你为什么用TreeMap而不是TreeSet
    • 具有讽刺意味的是,我只是想在吃午饭时改变它!猜猜你打败了我。
    【解决方案3】:

    您可以使用后缀树。请点击此链接: https://www.geeksforgeeks.org/pattern-searching-using-suffix-tree/

    【讨论】:

    【解决方案4】:

    使用流看起来很简单:

    String targetString = "eignelaiwgn";
    Collection<String> collection = Arrays.asList("eig", "a", "eb", "eigne", "eignep");
    
    Optional<String> longestMatch = collection.stream()
        .filter(targetString::contains)
        .max(Comparator.comparingInt(String::length));
    
    longestMatch.ifPresent(System.out::println); // eigne
    

    这读作: 对于集合中的每个字符串,检查目标字符串是否包含它。如果为真,则返回最大长度的字符串。 (因为集合可能是空的,或者集合中没有字符串可能匹配过滤器,max 返回一个Optional&lt;String&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 2014-06-25
      • 2014-10-07
      • 2017-09-23
      • 2021-11-10
      • 2018-12-25
      • 2011-11-09
      • 2013-05-18
      相关资源
      最近更新 更多