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

Pop*_*oko 22 java arrays string

我有两个String数组,让我们说:

String[] s1 = {"a","b","c"}
String[] s2 = {"c","a","b"} 
Run Code Online (Sandbox Code Playgroud)

//这些数组应该相等

我想以"最干净"的方式检查他们的平等.

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

你能告诉我怎样才能以一种好的方式做到这一点?

Mov*_*ast 31

  • 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)) );
Run Code Online (Sandbox Code Playgroud)

Arrays.sort()使用优化的快速排序,nlog(n)表示平均值,但在最坏的情况下为O(n2).来自java文档.因此最坏的情况是O(n2),但实际上大多数情况下都是O(nlogn).

排序算法是一个经过调整的快速排序,改编自Jon L. Bentley和M. Douglas McIlroy的"工程排序功能",软件实践和经验,卷.23(11)P.1249-1265(1993年11月).该算法在许多数据集上提供n*log(n)性能,导致其他快速降序降级为二次性能.

  • 我无法相信没有人指出`Arrays.sort`*会*修改列表,并返回`void`所以它甚至无法使用,如本答案中所示. (9认同)
  • `Arrays.sort(int [])`执行快速排序.但是,`Arrays.sort(Object [])`执行合并排序...... (2认同)

Luk*_*der 10

其他人建议对数组进行排序.但是,既然你正在寻找"最干净"的解决方案,我认为不应该触及原始阵列.因此:

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);
Run Code Online (Sandbox Code Playgroud)

  • @Popokoko:我认为值得一提的是,仅仅"平等"检查可能不应该修改原始数据.此代码生成数组的副本,并仅对副本进行排序 (3认同)