如何检查字符串是否包含集合中的字符串之一

时间:2018-12-19 06:28:11

标签: java string collections

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

目标字符串:str = "eignelaiwgn"

集合字符串:eigaebeigneeignep

结果必须为eigne

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

if ( str.contains("eigne") )

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

4 个答案:

答案 0 :(得分:2)

使用流似乎很简单:

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

这表示为:对于集合中的每个字符串,请检查目标字符串是否包含该字符串。如果为true,则返回最大长度的字符串。 (由于集合可能为空,或者集合中没有字符串可能与过滤器匹配,因此max返回一个Optional<String>

答案 1 :(得分:1)

您可以使用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并找到在原始字符串中存在子字符串的 first 事件。现在,由于TreeSet是按照长度的降序排序的,因此迭代将从最高到最低开始。

答案 2 :(得分:0)

您可以在Java中使用StringUtils类的LevensteinDistance()方法,该方法将告诉您将一个String更改为另一个String所需的更改次数。您可以打印所需的最少更改的字符串,这就是您的答案。请参阅此文档-> LevenshteinDistance

还要为同一个类寻找区别方法,该方法将告诉两个字符串之间的区别。

答案 3 :(得分:0)

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