Java:检查数组的相等性(顺序无关紧要)

2022-09-01 16:46:50

我有两个数组,比方说:String

String[] s1 = {"a","b","c"}
String[] s2 = {"c","a","b"} 

这些数组应该相等

我想以“最干净”的方式检查他们的平等性。

我尝试使用,但我得到一个错误的答案。我想这种方法关心元素的顺序,我不希望这很重要。Arrays.equals(s1,s2)

你能告诉我如何以一种好的方式做到这一点吗?


答案 1
  • Arrays.sort(s1);
  • Arrays.sort(s2);
  • Arrays.equals(s1,s2);

如果您不想修改原始数组

 Arrays.equals( Arrays.sort( Arrays.copyof(s1,s1.length)),
                Arrays.sort( Arrays.copyof(s2,s2.length)) );

Arrays.sort() 使用优化的快速排序,平均为 nlog(n),但最坏情况下为 O(n2)。从java文档。所以最坏的情况是它将是O(n2),但实际上在大多数情况下它将是O(nlogn)。

排序算法是一个经过调整的快速排序,改编自 Jon L. Bentley 和 M. Douglas McIlroy 的“Engineering a Sort Function”,Software-Practice and Experience,Vol. 23(11) P. 1249-1265(1993 年 11 月)。此算法在许多数据集上提供 n*log(n) 性能,这些数据集会导致其他快速排序降级为二次性能。


答案 2

其他人建议对数组进行排序。但是,由于您正在寻找“最干净”的解决方案,因此我认为不应该触及原始阵列。因此:

List<String> l1 = new ArrayList<String>(Arrays.asList(s1));
List<String> l2 = new ArrayList<String>(Arrays.asList(s2));

Collections.sort(l1);
Collections.sort(l2);

boolean outcome = l1.equals(l2);