7.2 查找两个不同列表是否包含完全相同的元素的简单方法? | Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:查找两个不同列表是否包含完全相同的元素的简单方法?

在标准Java库中查找两个List是否包含完全相同的元素的最简单方法是什么?

两个列表是否为同一实例无关紧要,并且列表的类型参数是否相同也无关紧要。

List list1
List<String> list2; 
// ... construct etc

list1.add("A");
list2.add("A"); 
// the function, given these two lists, should return true
复制代码

回答1:

如果您关心顺序,则只需使用equals方法:

list1.equals(list2)
复制代码

回答2:

比较对象e2与此列表e1是否相等。当且仅当指定对象e2也是一个列表,并且两个列表具有相同的大小,并且两个列表中所有对应的元素对相等时,才返回true。(如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等。)换句话说,如果两个列表包含相同顺序的相同元素,则两个列表定义为相等。 。此定义确保equals方法可在List接口的不同实现中正常工作。

如果不考虑顺序进行比较,则可以将所有元素复制到Sets并在结果Sets上使用equals:

public static <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
    return new HashSet<>(list1).equals(new HashSet<>(list2));
}
复制代码

这种方法的局限性在于它不仅忽略顺序,而且忽略重复元素的频率。例如,如果list1为[[A],“ B”,“ A”]并且list2为[“ A”,“ B”,“ B”],则该Set方法将认为它们相等。

如果您需要对顺序不敏感但对重复的频率敏感,

比较之前先对列表进行排序,

public  boolean equalLists(List<String> one, List<String> two){     
    if (one == null && two == null){
        return true;
    }

    if((one == null && two != null) 
      || one != null && two == null
      || one.size() != two.size()){
        return false;
    }

    //to avoid messing the order of the lists we will use a copy
    //as noted in comments by A. R. S.
    one = new ArrayList<String>(one); 
    two = new ArrayList<String>(two);   

    Collections.sort(one);
    Collections.sort(two);      
    return one.equals(two);
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享