Сортировка массивов одинакового размера по одному массиву

У меня есть n массивов одинаковой length (например, m). Массивы представляют разные свойства одного и того же m логических объектов, и я хочу отсортировать все массивы в соответствии с одним (или более) свойством. Какой идиоматический или любой компактный способ в Java для этого? Я придумал ниже, что очень много.

Чтобы дать представление о том, что я ищу, в Python вы можете просто сказать, что zip(size, weight).sort и другие языки позволяют получить ранг массива ключей, который затем можно применить к все массивы.

Использование широко распространенных утилит, таких как Apache Commons, приветствуется, но, очевидно, было бы предпочтительным решение на основе библиотек Java.

import java.util.*;

class Box {
 public int size;
 public int weight;

 Box( int size, int weight ){
 this.size = size;
 this.weight = weight;
 }
}

class SizeComparator implements Comparator<box> {
 @Override
 public int compare(Box a, Box b) {
 return a.size < b.size ? -1 : a.size == b.size ? 0 : 1;
 }
}

public class SortArrays {
 public static void main(String[] args) {
 int[] size = {5,3,6,2,4,4,2};
 int[] weight = {9,7,8,3,5,2,5};

 List<box> boxes = new ArrayList<box>();
 for( int i = 0; i < size.length; ++i ) {
 boxes.add( new Box( size[i], weight[i] ) );
 }

 Collections.sort( boxes, new SizeComparator() );
 int[] sortedSizes = getSizes( boxes );
 int[] sortedWeights = getWeights( boxes );

 System.out.println(Arrays.toString(sortedSizes));
 System.out.println(Arrays.toString(sortedWeights));
 }

 private static int[] getSizes( List<box> boxes ) {
 int[] result = new int[boxes.size()];
 for( int i = 0; i < boxes.size(); ++i ) {
 result[i] = boxes.get(i).size;
 }
 return result;
 }

 private static int[] getWeights( List<box> boxes ) {
 int[] result = new int[boxes.size()];
 for( int i = 0; i < boxes.size(); ++i ) {
 result[i] = boxes.get(i).weight;
 }
 return result;
 }
}
</box></box></box></box></box>
1 ответ

Нет необходимости создавать содержащий объект, если вы просто не хотите обернуть массив.

public static void sortMultiArrays(int[] ... index) {
 // merge arrays
 List<int[]> zip = new ArrayList<int[]>(index[0].length);
 for(int i = 0; i<index[0].length;i++){ int[]="" e="new" int[index.length];="" for(int="" j="0;" j<index.length;j++){="" e[j]="index[j][i];" }="" zip.add(e);="" sort="" by="" first="" index="" collections.sort(zip,new="" arraycomparator());="" demerge="" arrays="" i="0;" i<zip.size();i++)="" {="" ints="zip.get(i);" for="" (int="" index[j][i]="ints[j];" private="" static="" arraycomparator="" implements="" comparator<int[]="">{

 @Override
 public int compare(int[] a, int[] b) {
 return a[0] < b[0] ? -1 : a[0] == b[0] ? 0 : 1;
 }

}
</index[0].length;i++){></int[]></int[]>

licensed under cc by-sa 3.0 with attribution.