繁体   English   中英

检查list2.containsAll(list1)但字符串不完全相同

[英]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

您可以在列表中进行迭代,调用此库,然后保存结果以供以后比较

Java的字符串相似

好了,您可以检查每个字符串是否包含另一个列表中的字符串中的所有字母(单向包含):

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中的所有元素重复该操作并过滤该列表,那么可能会发生两件事:

  1. 结果列表的大小与list1相同:这意味着所有List2元素都在list1中
  2. 结果列表的大小与list1的大小不同:意味着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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM