为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

波斯汪 2019-12-16 10:16:21
在标准Java库中查找两个List是否包含完全相同的元素的最简单方法是什么?两个列表是否为同一实例无关紧要,并且列表的类型参数是否不同也无关紧要。例如List list1List<String> list2; // ... construct etclist1.add("A");list2.add("A"); // the function, given these two lists, should return true我认识的脸上可能有些东西盯着我:-)编辑:为了澄清,我在寻找完全相同的元素和数量的元素,按顺序。查找两个不同列表是否包含完全相同的元素的简单方法?
查看完整描述

4 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我在评论中张贴了一堆东西,我认为它值得自己回答。


就像大家在这里所说的,使用equals()取决于顺序。如果您不关心订单,则有3种选择。


选项1


使用containsAll()。我认为该选项不是理想的,因为它提供了最差情况的性能O(n ^ 2)。


选项2


有两种变体:


2a)如果您不关心维护列表的顺序,请Collections.sort()在两个列表上使用。然后使用equals()。这是O(nlogn),因为您进行了两种排序,然后进行了O(n)比较。


2b)如果您需要维护列表的顺序,则可以先复制两个列表。然后,您可以在两个复制的列表上使用解决方案2a。但是,如果复制非常昂贵,这可能没有吸引力。


这将导致:


选项3


如果您的要求与第2b部分相同,但是复制过于昂贵。您可以使用TreeSet为您进行排序。将每个列表转储到其自己的TreeSet中。它将在集合中排序,并且原始列表将保持不变。然后equals()对两个进行比较TreeSet。TreeSets可以在O(nlogn)时间建立,而s equals()是O(n)。


选择:-)。


编辑:我几乎忘了劳伦斯·贡萨尔维斯(Laurence Gonsalves)指出的警告。TreeSet实现将消除重复项。如果您关心重复项,则需要某种排序的多重集。


查看完整回答
反对 回复 2019-12-16
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

尝试使用此版本,该版本不需要顺序相同,但支持具有多个相同值。仅当每个具有相同数量的任何值时,它们才匹配。


public boolean arraysMatch(List<String> elements1, List<String> elements2) {

    // Optional quick test since size must match

    if (elements1.size() != elements2.size()) {

        return false;

    }

    List<String> work = newArrayList(elements2);

    for (String element : elements1) {

        if (!work.remove(element)) {

            return false;

        }

    }

    return work.isEmpty();

}


查看完整回答
反对 回复 2019-12-16
  • 4 回答
  • 0 关注
  • 640 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信