我想检查目标字符串是否包含集合中的字符串。并匹配最长的一个。例如。
目标字符串:str = "eignelaiwgn"
集合字符串:eig
,a
,eb
,eigne
,eignep
结果必须为eigne
首先,我想到了HashMap,但未对其进行排序。因此,我尝试将集合字符串放入ArrayList中,然后使用字符串长度对列表进行排序。然后使用for each
循环检查
if ( str.contains("eigne") )
这需要每次循环列表。有没有更好(更快)的方法来实现这一目标?
答案 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/