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

У меня есть 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.