使用Arrays.sort()对并行数组进行排序

是否可以使用Arrays.sort()对数组进行Arrays.sort() ,然后使另一个相关的数组与排序的数组相同,例如:

  String arrNames[] = new String[5]; String arrCellNo[] = new String[arrNames.length]; String arrNamesSorted[] = new String[arrNames.length]; System.arraycopy(arrNames, 0, arrNamesSorted, 0, arrNames.length); Arrays.sort(arrNamesSorted); 

从这一点开始,我想做的是对CellNo数组进行排序,这样如果“person”有一个cellNo“x”,那么在对数组arrNames进行排序后,他将拥有相同的“cellNo”“x”

我会采取不同的方法:

  1. 创建一个新对象:

     public class Person { private name; private cellNo; // Implement getters and setters } 
  2. 创建一个比较器:

     public MyComparator implements Comparator { public int compare(Person a, Person b) { return a.getName().compareTo(b.getName()); } } 
  3. Person[] persons = ...数组上调用Array.sort(persons, new MyComparator())

你不能让Arrays.sort按照它对第一个数组进行排序的方式操纵第二个数组。

解决方案是对包含所需数据的自己的对象进行排序。 创建具有名称和单元格编号属性的Contact类。 然后创建一个实现Comparator (比如ContactComparator )的类来比较名称。

然后,您将能够使用特定的Arrays.sort重载对 Contact对象数组进行Arrays.sort

 Arrays.sort(arrContacts, new ContactComparator()); 

所有数据将保持有序,因为相同的名称仍将具有相同的单元格编号。

如果名称是唯一的,请考虑使用SortedMap :

 final SortedMap nameToCellNo = new TreeMap<>(); for (int i = 0; i < arrNames.length; i++) { nameToCellNo.put(arrNames[i], arrCellNo[i]); } int ctr = 0; for (Map.Entry entry : nameToCellNo.entrySet()) { arrNamesSorted[ctr] = entry.getKey(); arrCellNoSorted[ctr++] = entry.getValue(); } 

我发现答案中引入的一些概念难以理解,因此在我自己的解决方案中采用了不合需要的编程方法作为代码交易更容易理解并创建了一个冒泡排序方法,并最终操纵了第二个数组,如下所示:

 String arrNames[] = new String[5]; String arrCellNo[] = new String[arrNames.length]; String arrNamesSorted[] = new String[arrNames.length]; String arrCellNoSorted[] = new String[arrCellNo.length]; System.arraycopy(arrNames, 0, arrNamesSorted, 0, arrNames.length); System.arraycopy(arrCellNo, 0, arrCellNoSorted, 0, arrCellNo.length); for (int i = 0; i < arrNamesSorted.length; i++) { for (int j = 0; j 0) { String temp = arrNamesSorted[i]; arrNamesSorted[i] = arrNamesSorted[j]; arrCellNoSorted[i] = arrCellNoSorted[j]; arrNames[j] = temp; } } } 

可以使用内置的Arrays.sort来存档效果,而无需为并行数组内容创建类。

请注意,索引应该是对象数组 ,而不是基本数组 。 ( Arrays.sort(int[])不带比较器)

 final int n = 10; int[] values = new int[n]; Integer[] index = new Integer[n]; par_foreach(n, i -> index[i] = i); par_foreach(n, i -> values[i] = random.nextInt(100)); Arrays.sort(index, (a, b) -> Integer.compare(values[a], values[b])); println("values", values); println("index", index); print("ordered:"); foreach(n, i -> print(" " + values[index[i]])); println(); 

备注

foreach :: Num -> (Num -> void) (parallel) par_foreach :: Num -> (Num -> void)万一你无法想象实现: https : //github.com/beenotung/javalib/blob/master /src/com/github/beenotung/javalib/Utils.java