Java 数组等于忽略顺序
可能重复:Java 数组等于忽略顺序,java,arrays,equals,Java,Arrays,Equals,可能重复: 我有两个阵列: String[] a1 = {"a", "b", "c"}; String[] a2 = {"c", "b", "a"}; 我需要检查两者是否包含相同的元素(且长度相同)而不考虑元素的顺序 我尝试了数组。等于(a1,a2)但它考虑了元素的顺序。 org.apache.commons.lang.ArrayUtils不提供此功能 我知道我可以通过创建自己的方法(检查相同的长度,然后对两个数组进行排序,然后使用数组。equals(a1,a2))实现相同的效果,但我想知道
我有两个阵列:
String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
我需要检查两者是否包含相同的元素(且长度相同)而不考虑元素的顺序
我尝试了数组。等于(a1,a2)
但它考虑了元素的顺序。
org.apache.commons.lang.ArrayUtils
不提供此功能
我知道我可以通过创建自己的方法(检查相同的长度,然后对两个数组进行排序,然后使用
数组。equals(a1,a2)
)实现相同的效果,但我想知道是否有API提供了此功能,或者有更聪明的方法来实现相同的功能。在比较之前将列表转换为集合:
new HashSet( Arrays.asList( a1 )).equals( new HashSet( Arrays.asList( a2 ) ));
或者,您可以使用
arrays.sort()
对数组进行排序,但这可能会破坏代码,这取决于数组中元素的顺序。如果这些数组是从集合继承的,您可以从集合接口使用Collection.containsAll(其他集合)
。但是,您还需要比较两个集合的长度,以验证其中一个集合不是另一个集合的超集
(感谢来到Aardvark和piegames。)
注意:这将在一定程度上起作用。这是为了检查至少一个现有的元素。也就是说,如果一个集合中有3个a
值,另一个集合中有7个a
值,则不一定会导致它将它们称为不等
示例:
[a, b, c] == [c, a, b] // Works -- Mixed order
[a, b, c, d, d] == [a, b, d, c, d] // Works -- Mixed order with repeats
[a, b, c, d, d] == [a, b, b, c, d] // FAILS -- Different repeats
[a, b, c, d, d] != [a, b, c, d] // Works -- Length differs with repeats
[a, b, c, d] != [a, b, c] // Works -- Length differs
[a, b, d] != [a, b, c] // Works -- Disjoint sets
使用
java.util.Set
methodequals
。比较两个大小相同的集合,并且指定集合的每个成员都包含在另一个集合中。我认为这可能适用于您,请使用对第一个数组排序
Arrays.sort(Object[]);
然后你就可以和
Arrays.equals(Object[],Object[]);
完整代码为:
String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
Arrays.sort(a2);
boolean result= Arrays.equals(a1, a2);
您是否尝试过数组排序(a2),然后检查它们是否相等?您可以在调用arrays.equals之前对数组进行排序,但这样做成本较高。一个可能更有效的解决方案是将第一个数组的项添加到哈希集中,然后检查第二个数组的哪些项仍在哈希集中。这仅在没有重复项的情况下才有效。这也更有效高效,因为它运行O(m+n),而在列表上执行containsAll是O(n^2+m^2),您不需要在两个方向上都检查containsAll吗?单向求值将为另一个集合的超集返回true,而该集合似乎不是OP想要的。@aardvarkk极好的一点!我将编辑我的帖子。这不能正确处理重复的帖子。JavaDoc没有明确说明这一点,但是
a.containsAll(b)
iffa
为b
中的每个元素x
至少包含一个x
。例如,尝试使用a={5}
,b={5,5}
进行测试。当被视为多集时,它们并不相等,但containsAll
在两个方向上都返回true
。至少这是实践中使用的containsAll
的解释。即使是Guava的“也不考虑元素的出现计数”。@aardvarkk仅仅检查两个数组的长度而不是第二个containsAll是否足够?(假设没有重复项)排序应在a1和a2上进行。不能保证a1已经被排序。即使如此,排序也不总是一个好主意:它会改变数据。如果你不想要它,你必须复制数据,这需要花费时间和内存。如果对象没有实现,这将不起作用