Per ordinare un elenco di array di int, si desidera una funzione che esegue un lessicografica confronto di un array di int. Questo è solitamente espresso come Comparator<int[]>
in Java. Il modo usuale per implementare tale funzione è confrontare i valori corrispondenti da sinistra a destra fino a trovare una discrepanza; quella discrepanza determina l'ordine. Se viene raggiunta la fine di un array senza trovare una discrepanza, l'array più corto viene generalmente considerato inferiore a quello più lungo. Se le lunghezze sono uguali e tutti i valori sono uguali, gli array sono considerati uguali.
altre risposte hanno usato classi interne anonime o lambda per questa funzione, ma per cose come questa io preferisco un metodo ordinario che ha la "forma" a destra, cioè, che prende due int[]
argomenti e restituisce un int
che è il risultato del confronto. Ciò consente di utilizzarlo come destinazione di un riferimento al metodo.
int arrayCompare(int[] a, int[] b) {
int len = Math.min(a.length, b.length);
for (int i = 0; i < len; i++) {
int c = Integer.compare(a[i], b[i]);
if (c != 0) {
return c;
}
}
return a.length - b.length;
}
attenzione all'uso di Integer.compare()
invece di sottrazione, evitando potenziali problemi con troppopieno. Utilizzo potrebbe essere la seguente:
List<int[]> arrays = Arrays.asList(
new int[] { 0, 1, 4, 5 },
new int[] { 0, 0, 2, 3 },
new int[] { 0, 1, 1, 2 }
);
arrays.sort(this::arrayCompare);
arrays.forEach(a -> System.out.println(Arrays.toString(a)));
In JDK 9, sono state aggiunte funzioni di confronto di matrice lessicografico alla classe Arrays
. Vedi Arrays.compare(int[], int[])
. Esistono anche sovraccarichi per gli altri tipi primitivi e per i tipi di riferimento. Il int[]
sovraccarico sostituisce la funzione arrayCompare
ho scritto sopra, in modo da poter riscrivere la chiamata sorta come segue:
arrays.sort(Arrays::compare);
Il vantaggio delle funzioni di confronto nella classe Arrays
è che possono essere gestite appositamente dalla JVM, che può, ad esempio, utilizzare le istruzioni vettoriali per accelerare i confronti dell'array.
Per il vostro problema specifico, sembra che non si dispone di un elenco di int[]
, ma si dispone di un elenco di oggetti di tipo MyObject
che hanno un int[]
che si desidera utilizzare come chiave di ordinamento. Supponiamo che il modo per ottenere l'array sia chiamando il metodo getArray()
. È possibile ordinare la lista come segue:
myObjects.sort(Comparator.comparing(MyObject::getArray, Arrays::compare));
Per essere chiari: il mio è un array int [] non è un Integer [] – Maikefer
Questo è davvero interessante, ma ... ci non mostrare ciò che hai provato. Cosa ti impedisce di produrre un codice? –
Se gli array sono privati, come prevedi di usarli per ordinare i tuoi oggetti? Non è possibile confrontare le proprietà private. – Rainbolt