Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组等于忽略顺序_Java_Arrays_Equals - Fatal编程技术网

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
method
equals
。比较两个大小相同的集合,并且指定集合的每个成员都包含在另一个集合中。

我认为这可能适用于您,请使用对第一个数组排序

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)
iff
a
b
中的每个元素
x
至少包含一个
x
。例如,尝试使用
a={5}
b={5,5}
进行测试。当被视为多集时,它们并不相等,但
containsAll
在两个方向上都返回
true
。至少这是实践中使用的
containsAll
的解释。即使是Guava的“也不考虑元素的出现计数”。@aardvarkk仅仅检查两个数组的长度而不是第二个containsAll是否足够?(假设没有重复项)排序应在a1和a2上进行。不能保证a1已经被排序。即使如此,排序也不总是一个好主意:它会改变数据。如果你不想要它,你必须复制数据,这需要花费时间和内存。如果对象没有实现,这将不起作用