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实现将消除重复项。如果您关心重复项,则需要某种排序的多重集。
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();
}
添加回答
举报