Ordinamento di array in Java

1. Panoramica

In questo tutorial, discuteremo dei metodi comuni per ordinare gli array in ordine crescente e decrescente.

Vedremo come utilizzare il metodo di ordinamento delle classi Arrays di Java e implementeremo il nostro Comparatore per ordinare i valori dei nostri array.

2. Definizioni degli oggetti

Prima di iniziare, definiamo rapidamente alcuni array che ordineremo in questo tutorial. Innanzitutto, creeremo un array di int e un array di stringhe:

int[] numbers = new int[] { -8, 7, 5, 9, 10, -2, 3 }; String[] strings = new String[] { "learning", "java", "with", "baeldung" };

E creiamo anche un array di oggetti Employee in cui ogni dipendente ha un id e un attributo name :

Employee john = new Employee(6, "John"); Employee mary = new Employee(3, "Mary"); Employee david = new Employee(4, "David"); Employee[] employees = new Employee[] { john, mary, david };

3. Ordinamento in ordine crescente

Il metodo util.Arrays.sort di Java ci fornisce un modo semplice e veloce per ordinare un array di primitive o oggetti che implementano l' interfaccia Comparable in ordine crescente.

Quando si ordinano le primitive, il metodo Arrays.sort utilizza un'implementazione Dual-Pivot di Quicksort. Tuttavia, quando si ordinano gli oggetti, viene utilizzata un'implementazione iterativa di MergeSort.

3.1. Primitivi

Per ordinare un array primitivo in ordine crescente, passiamo il nostro array al metodo di ordinamento :

Arrays.sort(numbers); assertArrayEquals(new int[] { -8, -2, 3, 5, 7, 9, 10 }, numbers); 

3.2. Oggetti che implementano confrontabili

Per gli oggetti che implementano l' interfaccia Comparable , come con il nostro array primitivo, possiamo anche semplicemente passare il nostro array al metodo di ordinamento :

Arrays.sort(strings); assertArrayEquals(new String[] { "baeldung", "java", "learning", "with" }, strings);

3.3. Oggetti che non implementano confrontabili

L'ordinamento di oggetti che non implementano l' interfaccia comparabile , come il nostro array di dipendenti , ci richiede di specificare il nostro comparatore.

Possiamo farlo molto facilmente in Java 8 specificando la proprietà su cui vorremmo confrontare i nostri oggetti Employee nel nostro Comparatore:

Arrays.sort(employees, Comparator.comparing(Employee::getName)); assertArrayEquals(new Employee[] { david, john, mary }, employees);

In questo caso, abbiamo specificato che vorremmo ordinare i nostri dipendenti in base ai loro attributi di nome .

Possiamo anche ordinare i nostri oggetti su più di un attributo concatenando i nostri confronti utilizzando il metodo thenComparing di Comparator :

Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId));

4. Ordinamento in ordine decrescente

4.1. Primitivi

Ordinare un array primitivo in ordine decrescente non è così semplice come ordinarlo in ordine crescente perché Java non supporta l'uso di comparatori sui tipi primitivi. Per ovviare a questa carenza abbiamo alcune opzioni.

Innanzitutto, potremmo ordinare il nostro array in ordine crescente e quindi eseguire un'inversione sul posto dell'array.

Secondo, potrebbe convertire il nostro array in un elenco, utilizzare il metodo Lists.reverse () di Guava e quindi riconvertire il nostro elenco in un array.

Infine, potremmo trasformare il nostro array in un flusso e quindi mapparlo di nuovo su un array int . Ha un bel vantaggio di essere un one-liner e utilizzare solo Java core:

numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray(); assertArrayEquals(new int[] { 10, 9, 7, 5, 3, -2, -8 }, numbers);

Il motivo per cui funziona è che scatolati vicenda ciascuna int in un numero intero , che non attuare comparatore.

4.2. Oggetti che implementano confrontabili

Ordinare un array di oggetti che implementa l' interfaccia Comparable in ordine decrescente è abbastanza semplice. Tutto quello che dobbiamo fare è passare un Comparatore come secondo parametro del nostro metodo di ordinamento .

In Java 8 possiamo usare Comparator.reverseOrder () per indicare che vorremmo che il nostro array fosse ordinato in ordine decrescente:

Arrays.sort(strings, Comparator.reverseOrder()); assertArrayEquals(new String[] { "with", "learning", "java", "baeldung" }, strings);

4.3. Oggetti che non implementano confrontabili

Analogamente all'ordinamento di oggetti che implementano comparable, possiamo invertire l'ordine del nostro comparatore personalizzato aggiungendo reversed () alla fine della nostra definizione di confronto:

Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); assertArrayEquals(new Employee[] { mary, john, david }, employees);

5. conclusione

In questo articolo abbiamo discusso come ordinare gli array di primitive e oggetti in ordine crescente e decrescente utilizzando il metodo Arrays.sort .

Come al solito, il codice sorgente di questo articolo può essere trovato su Github.