Sorteringsarrays i Java

1. Oversigt

I denne vejledning diskuterer vi almindelige metoder til at sortere arrays i stigende og faldende rækkefølge.

Vi ser på at bruge Java'er Arrays klassesorteringsmetode samt implementering af vores egen Komparator at bestille vores arrays værdier.

2. Objektdefinitioner

Før vi begynder, lad os hurtigt definere et par arrays, som vi sorterer gennem denne tutorial. Først opretter vi en række ints og en række strenge:

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

Og lad os også oprette en række Medarbejder objekter, hvor hver medarbejder har en id og en navn attribut:

Medarbejder john = ny medarbejder (6, "John"); Medarbejder mary = ny medarbejder (3, "Mary"); Medarbejder david = ny medarbejder (4, "David"); Medarbejder [] medarbejdere = ny medarbejder [] {john, mary, david};

3. Sortering i stigende rækkefølge

Java'er util.Arrays.sort metoden giver os en hurtig og enkel måde at sortere en række primitiver eller objekter, der implementerer Sammenlignelig interface i stigende rækkefølge.

Ved sortering af primitiver, Arrays.sort metode bruger en Dual-Pivot implementering af Quicksort. Ved sortering af objekter anvendes dog en iterativ implementering af MergeSort.

3.1. Primitiver

For at sortere et primitivt array i stigende rækkefølge, videregiver vi vores array til sortere metode:

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

3.2. Objekter, der gennemføres sammenlignelige

For objekter, der implementerer Sammenlignelig interface, som med vores primitive array, kan vi også bare overføre vores array til sortere metode:

Arrays.sort (strenge); assertArrayEquals (ny streng [] {"baeldung", "java", "learning", "with"}, strings);

3.3. Objekter, der ikke implementeres sammenlignelige

Sortering af objekter, der ikke implementerer Sammenlignelig Interface, ligesom vores udvalg af Medarbejdere, kræver, at vi specificerer vores egen komparator.

Vi kan gøre dette meget let i Java 8 ved at specificere den egenskab, som vi gerne vil sammenligne vores Medarbejder genstande på inden for vores Komparator:

Arrays.sort (medarbejdere, Comparator.comparing (Medarbejder :: getName)); assertArrayEquals (ny medarbejder [] {david, john, mary}, medarbejdere);

I dette tilfælde har vi specificeret, at vi gerne vil bestille vores medarbejdere efter deres navn egenskaber.

Vi kan også sortere vores objekter på mere end én attribut ved at kæde vores sammenligninger ved hjælp af Comparator's thenComparing metode:

Arrays.sort (medarbejdere, Comparator.comparing (Medarbejder :: getName). DerefterComparing (Medarbejder :: getId));

4. Sortering i faldende rækkefølge

4.1. Primitiver

Sortering af et primitivt array i faldende rækkefølge er ikke helt så simpelt som at sortere det i stigende rækkefølge, fordi Java ikke understøtter brugen af Komparatorer på primitive typer. For at overvinde denne mangel har vi et par muligheder.

Først kunne vi sorter vores array i stigende rækkefølge, og foretag derefter en vending på stedet af arrayet.

For det andet kunne konvertere vores array til en liste, brug Guava Lists.reverse () metode og konverter derefter vores liste tilbage til en matrix.

Endelig kunne vi omdanne vores array til en Strøm og kortlæg det derefter tilbage til et int array. Det har en god fordel at være en one-liner og bare ved hjælp af core Java:

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

Årsagen til, at dette fungerer, er, at kasse vender hver int ind i en Heltal, hvilken gør implementere Komparator.

4.2. Objekter, der gennemføres sammenlignelige

Sortering af et objekt array, der implementerer Sammenlignelig interface i faldende rækkefølge er ret simpelt. Alt hvad vi skal gøre er at videregive a Komparator som den anden parameter for vores sortere metode.

I Java 8 kan vi bruge Comparator.reverseOrder () for at indikere, at vi gerne vil have, at vores matrix sorteres i faldende rækkefølge:

Arrays.sort (strings, Comparator.reverseOrder ()); assertArrayEquals (ny streng [] {"med", "læring", "java", "baeldung"}, strenge);

4.3. Objekter, der ikke implementeres sammenlignelige

På samme måde som at sortere objekter, der implementerer sammenlignelige, kan vi vende rækkefølgen efter vores skik Komparator ved at tilføje omvendt () i slutningen af ​​vores sammenligningsdefinition:

Arrays.sort (medarbejdere, Comparator.comparing (Medarbejder :: getName) .omvendt ()); assertArrayEquals (ny medarbejder [] {mary, john, david}, medarbejdere);

5. Konklusion

I denne artikel diskuterede vi, hvordan man sorterer arrays af primitiver og objekter i stigende og faldende rækkefølge ved hjælp af Arrays.sort metode.

Som normalt kan kildekoden fra denne artikel findes på Github.