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

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


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


例如


List list1

List<String> list2; 

// ... construct etc


list1.add("A");

list2.add("A"); 

// the function, given these two lists, should return true

我认识的脸上可能有些东西盯着我:-)


编辑:为了澄清,我在寻找完全相同的元素和数量的元素,按顺序。

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

波斯汪
浏览 641回答 4
4回答

撒科打诨

我在评论中张贴了一堆东西,我认为它值得自己回答。就像大家在这里所说的,使用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实现将消除重复项。如果您关心重复项,则需要某种排序的多重集。

慕哥9229398

尝试使用此版本,该版本不需要顺序相同,但支持具有多个相同值。仅当每个具有相同数量的任何值时,它们才匹配。public boolean arraysMatch(List<String> elements1, List<String> elements2) {&nbsp; &nbsp; // Optional quick test since size must match&nbsp; &nbsp; if (elements1.size() != elements2.size()) {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; List<String> work = newArrayList(elements2);&nbsp; &nbsp; for (String element : elements1) {&nbsp; &nbsp; &nbsp; &nbsp; if (!work.remove(element)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return work.isEmpty();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java