[英]check if list2.containsAll(list1) but with not exact same String
我有List1和List2,如果List1中的所有字符串都以类似的形式存在(请参见下文),我想收到true。
现在的问题是
List1:
1. iscat
2. ishooman
3. isdoge
List2:
1. is_Cat
2. is_Hooman
3. is_doge
从逻辑上讲,函数list2.containsAll(list1)
返回false,因为字符串不相等。
我如何检查类似的字符串? 我可以想到Regex,但是现在我没有一个明确的术语,我也不知道如何在Java中使用Regex。
谢谢
commons-collections4有一个CollectionUtils.isEqualCollection()方法,并以Equator(类似于equals()方法)作为输入。
您可以生成一个赤道使这些字符串相同,然后调用isEqualCollection()
Equator<String> equator = new Equator<String>() {
@Override
public boolean equate(String o1, String o2) {
if (StringUtils.equalsIgnoreCase(o1.replaceAll("_", ""), o2.replaceAll("_", ""))) {
return true;
} else {
return false;
}
}
@Override
public int hash(String o) {
return HashCodeBuilder.reflectionHashCode(o.replaceAll("_", "")).toLowerCase();
}
};
List<String> a = new ArrayList<>();
List<String> b = new ArrayList<>();
a.add("iscat");
b.add("is_Cat");
System.out.println(CollectionUtils.isEqualCollection(a, b, equator));
并且有一个类似的CollectionUtils.removeAll()函数。 我只看到您只需要containAll(),因此可以改用removeAll。 如果在A removeAll B之后没有任何剩余,我们可以看到B containsAllA。
GitHub上有一个可以检查String相似性的API,您可以使用它!
可以看出Jaro-Winkler实现了相似度和距离(?)的算法。 检查以下示例:
import info.debatty.java.stringsimilarity.*;
public class MyApp {
public static void main(String[] args) {
JaroWinkler jw = new JaroWinkler();
// substitution of s and t
System.out.println(jw.similarity("My string", "My tsring"));
// substitution of s and n
System.out.println(jw.similarity("My string", "My ntrisg"));
}
}
输出:
0.9740740656852722
0.8962963223457336
您可以在列表中进行迭代,调用此库,然后保存结果以供以后比较
好了,您可以检查每个字符串是否包含另一个列表中的字符串中的所有字母(单向包含):
for(int i = 0; i<list1.size();i++){
if(Collections.contains(list1.get(i).toLowerCase().toCharacterArray(),list2.get(i).toLowerCase().toCharacterArray())
|| Collections.contains(list2.get(i).toLowerCase().toCharacterArray(),list1.get(i).toLowerCase().toCharacterArray())){
//then they are similar
}
}
这将检查其中一个字符串的字符数组是否包含在另一个字符串中。
尝试这样的事情:
List<String> l1 = Arrays.asList("iscat", "ishooman", "isdoge");
List<String> l2 = Arrays.asList("is_Cat", "is_Hooman", "is_doge");
System.out.println(l2.stream().map(s->s.toLowerCase().replace("_", "")).collect(Collectors.toList()).containsAll(l1));
上面的代码使用流使用以下逻辑将字符串映射到所需格式: s->s.toLowerCase().replace("_", "")
。 如果有更多更改,则可以添加更多逻辑。
希望这可以帮助!
假设您将list2的一个元素转换为小写并删除_,然后检查list1中是否存在该元素,现在如果您对list2中的所有元素重复该操作并过滤该列表,那么可能会发生两件事:
List<String> myList = Arrays.asList("iscat", "ishooman", "isdoge");
List<String> myList2 = Arrays.asList("is_Cat", "is_Hooman", "is_Doge");
List<String> myListResult = new ArrayList<>(myList);
myListResult = myList2.stream().filter(x -> myList.contains(x.toLowerCase().replace("_", "")))
.collect(Collectors.toList());
System.out.println(myListResult.size() == myList.size());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.