Sorteringsarrayer i Java

1. Oversikt

I denne opplæringen vil vi diskutere vanlige metoder for å sortere matriser i stigende og synkende rekkefølge.

Vi ser på bruk av Java-er Arrays klassesorteringsmetode samt implementering av vår egen Komparator for å bestille verdiene våre til matriser.

2. Objektdefinisjoner

Før vi begynner, la oss raskt definere noen matriser som vi vil sortere gjennom denne opplæringen. Først skal vi lage en rekke ints og en rekke strenger:

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

Og la oss også lage en rekke Ansatt objekter der hver ansatt har en id og en Navn Egenskap:

Ansatt john = ny ansatt (6, "John"); Ansatt mary = ny ansatt (3, "Mary"); Ansatt david = ny ansatt (4, "David"); Ansatt [] ansatte = ny ansatt [] {john, mary, david};

3. Sortering i stigende rekkefølge

Java util.Arrays.sort metoden gir oss en rask og enkel måte å sortere en rekke primitiver eller objekter som implementerer Sammenlignelig grensesnitt i stigende rekkefølge.

Ved sortering av primitiver, Arrays.sort metoden bruker en Dual-Pivot-implementering av Quicksort. Når du sorterer objekter, brukes imidlertid en iterativ implementering av MergeSort.

3.1. Primitiver

For å sortere et primitivt array i stigende rekkefølge, overfører vi vårt array til sortere metode:

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

3.2. Objekter som implementerer sammenlignbare

For objekter som implementerer Sammenlignelig grensesnitt, som med vårt primitive array, kan vi også bare overføre arrayet vårt til sortere metode:

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

3.3. Objekter som ikke implementeres sammenlignbare

Sortere objekter som ikke implementerer Sammenlignelig Grensesnitt, som vårt utvalg av Ansatte, krever at vi spesifiserer vår egen komparator.

Vi kan gjøre dette veldig enkelt i Java 8 ved å spesifisere egenskapen som vi vil sammenligne Ansatt gjenstander i vårt Komparator:

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

I dette tilfellet har vi spesifisert at vi ønsker å bestille våre ansatte etter deres Navn attributter.

Vi kan også sortere objektene våre på mer enn ett attributt ved å kjede sammenligningene våre ved hjelp av Comparator er da sammenligning metode:

Arrays.sort (ansatte, Comparator.comparing (ansatt :: getName) .thenComparing (ansatt :: getId));

4. Sortering i synkende rekkefølge

4.1. Primitiver

Å sortere en primitiv matrise i synkende rekkefølge er ikke fullt så enkel som å sortere den i stigende rekkefølge fordi Java ikke støtter bruken av Sammenligning på primitive typer. For å overvinne denne mangelen har vi noen få alternativer.

Først kunne vi det sortere matrisen vår i stigende rekkefølge og deretter gjøre en reversering på stedet av matrisen.

For det andre, kunne konvertere matrisen vår til en liste, bruk Guava Lists.reverse () metode og konverter deretter listen vår tilbake til en matrise.

Til slutt kunne vi forvandle matrisen vår til en Strøm og kart det deretter tilbake til et int array. Det har en fin fordel av å være en one-liner og bare bruker core Java:

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

Grunnen til at dette fungerer er at bokset snur hver int inn i en Heltall, hvilken gjør implementere Komparator.

4.2. Objekter som implementerer sammenlignbare

Sortere et objekt array som implementerer Sammenlignelig grensesnitt i fallende rekkefølge er ganske enkelt. Alt vi trenger å gjøre er å passere a Komparator som den andre parameteren for vår sortere metode.

I Java 8 kan vi bruke Comparator.reverseOrder () for å indikere at vi ønsker at matrisen vår skal sorteres i synkende rekkefølge:

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

4.3. Objekter som ikke implementeres sammenlignbare

På samme måte som å sortere objekter som kan implementeres sammenlignbare, kan vi snu rekkefølgen på vår skikk Komparator ved å legge til omvendt () på slutten av vår sammenligningsdefinisjon:

Arrays.sort (ansatte, Comparator.comparing (Ansatt :: getName) .reversed ()); assertArrayEquals (ny ansatt [] {mary, john, david}, ansatte);

5. Konklusjon

I denne artikkelen diskuterte vi hvordan man kan sortere matriser av primitive og objekter i stigende og synkende rekkefølge ved hjelp av Arrays.sort metode.

Som vanlig kan kildekoden fra denne artikkelen finnes på Github.


$config[zx-auto] not found$config[zx-overlay] not found