Sorteringsarrayer i Java

1. Översikt

I denna handledning diskuterar vi vanliga metoder för att sortera matriser i stigande och fallande ordning.

Vi tittar på att använda Java: s Arrays klass sorteringsmetod samt implementera vår egen Comparator för att beställa våra arrays värden.

2. Objektdefinitioner

Innan vi börjar, låt oss snabbt definiera några matriser som vi kommer att sortera genom hela denna handledning. Först skapar vi en uppsättning strängar och en rad strängar:

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

Och låt oss också skapa en rad Employee objekt där varje medarbetare har en id och ett namn attribut:

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. Sortering i stigande ordning

Java's util.Arrays.sort- metod ger oss ett snabbt och enkelt sätt att sortera en uppsättning primitiver eller objekt som implementerar det jämförbara gränssnittet i stigande ordning.

Vid sortering av primitiva använder Arrays.sort- metoden en Dual-Pivot-implementering av Quicksort. Men vid sortering av objekt används en iterativ implementering av MergeSort.

3.1. Primitiver

För att sortera en primitiv array i stigande ordning skickar vi vår array till sorteringsmetoden :

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

3.2. Objekt som implementerar jämförbara

För objekt som implementerar det jämförbara gränssnittet, som med vår primitiva array, kan vi också helt enkelt skicka vår array till sorteringsmetoden :

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

3.3. Objekt som inte implementeras jämförbara

Att sortera objekt som inte implementerar det jämförbara gränssnittet, som vårt utbud av anställda , kräver att vi anger vår egen komparator.

Vi kan göra detta väldigt enkelt i Java 8 genom att specificera den egenskap som vi vill jämföra våra medarbetarobjekt på i vår komparator:

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

I det här fallet har vi angett att vi vill beställa våra anställda med sina namn attribut.

Vi kan också sortera våra objekt på mer än ett attribut genom att kedja våra jämförelser med hjälp av Comparators thenComparing- metod:

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

4. Sortering i fallande ordning

4.1. Primitiver

Att sortera en primitiv array i fallande ordning är inte lika enkel som att sortera den i stigande ordning eftersom Java inte stöder användningen av Comparators på primitiva typer. För att övervinna denna brist har vi några alternativ.

Först kunde vi sortera vår matris i stigande ordning och sedan göra en omvänd plats på matrisen.

För det andra kan vi konvertera vår matris till en lista, använda Guavas Lists.reverse () -metod och sedan konvertera vår lista tillbaka till en matris.

Slutligen kan vi förvandla vår matris till en ström och sedan mappa den tillbaka till en int- matris. Det har en bra fördel att vara en enfodrad och bara använda Java-kärnan:

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

Anledningen till att detta verk är att inramade varv varje int i en Integer som inte genomför komparator.

4.2. Objekt som implementerar jämförbara

Att sortera en objektmatris som implementerar det jämförbara gränssnittet i fallande ordning är ganska enkelt. Allt vi behöver göra är att skicka en komparator som den andra parametern för vår sorteringsmetod .

I Java 8 kan vi använda Comparator.reverseOrder () för att indikera att vi vill att vår matris ska sorteras i fallande ordning:

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

4.3. Objekt som inte implementeras jämförbara

På samma sätt som att sortera objekt som implementerar jämförbara kan vi vända ordningen på vår anpassade komparator genom att lägga till reversed () i slutet av vår jämförelsesdefinition:

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

5. Sammanfattning

I den här artikeln diskuterade vi hur man sorterar arrays av primitiva och objekt i stigande och fallande ordning med hjälp av Arrays.sort- metoden.

Som vanligt finns källkoden från den här artikeln på Github.