Sortiranje nizova u Javi

1. Pregled

U ovom uputstvu razgovarat ćemo o uobičajenim metodama sortiranja nizova u rastućem i silaznom redoslijedu.

Razmotrit ćemo korištenje Jave Nizovi metoda sortiranja klasa, kao i primjena vlastite Usporednik kako bismo naručili vrijednosti naših nizova.

2. Definicije objekata

Prije nego započnemo, brzo definirajmo nekoliko nizova koje ćemo razvrstati kroz ovaj tutorial. Prvo ćemo stvoriti niz inti i niz nizova:

int [] brojevi = novi int [] {-8, 7, 5, 9, 10, -2, 3}; String [] stringovi = novi String [] {"učenje", "java", "sa", "baeldung"};

Ajmo također stvoriti niz Zaposlenik predmeti kod kojih svaki zaposlenik ima iskaznica i a Ime atribut:

Zaposlenik john = novi zaposlenik (6, "John"); Zaposlenica mary = nova zaposlenica (3, "Mary"); Zaposlenik david = novi zaposlenik (4, "David"); Zaposlenik [] zaposlenici = novi zaposlenik [] {john, mary, david};

3. Sortiranje u rastućem redoslijedu

Java util.Arrays.sort metoda pruža nam brz i jednostavan način za sortiranje niza primitiva ili objekata koji implementiraju Usporedive sučelje u rastućem redoslijedu.

Prilikom sortiranja primitiva, Nizovi.sort metoda koristi dvostruku izvedbu Quicksort-a. Međutim, pri sortiranju objekata koristi se iterativna implementacija MergeSort.

3.1. Primitivci

Da bismo sortirali primitivni niz u rastućem redoslijedu, svoj niz prosljeđujemo u vrsta metoda:

Nizovi.sort (brojevi); assertArrayEquals (novi int [] {-8, -2, 3, 5, 7, 9, 10}, brojevi); 

3.2. Objekti koji se provode usporedivi

Za objekte koji implementiraju Usporedive sučelje, kao i s našim primitivnim nizom, također možemo jednostavno prenijeti svoj niz na vrsta metoda:

Nizovi.sort (žice); assertArrayEquals (novi String [] {"baeldung", "java", "learning", "with"}, nizovi);

3.3. Objekti koji se ne provode usporedivi

Sortiranje objekata koji ne implementiraju Usporedive Sučelje, poput našeg niza Zaposlenici, zahtijeva da odredimo vlastiti usporednik.

To možemo učiniti vrlo jednostavno u Javi 8 navođenjem svojstva koje bismo željeli usporediti Zaposlenik predmeti unutar našeg Usporednik:

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

U ovom smo slučaju precizirali da bismo htjeli svojim zaposlenicima naručiti po njihovom Ime atributi.

Također možemo sortirati svoje objekte na više od jednog atributa ulančavanjem usporedbi pomoću Usporednik tada Usporedba metoda:

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

4. Sortiranje u silaznom redoslijedu

4.1. Primitivci

Sortiranje primitivnog niza u silaznom redoslijedu nije baš jednostavno kao sortiranje u rastućem redoslijedu jer Java ne podržava upotrebu Usporednici na primitivnim tipovima. Da bismo prevladali taj nedostatak, imamo nekoliko mogućnosti.

Prvo, mogli bismo sortirajte naš niz u rastućem redoslijedu, a zatim napravite preokret na mjestu niza.

Drugo, mogao bi pretvoriti naš niz u popis, koristite Guava Lists.reverse () metoda a zatim pretvorite naš popis natrag u niz.

Napokon, mogli bismo transformirati svoj niz u Stream a zatim ga preslikajte natrag na int niz. Ima lijepu prednost što je jednoslojna linija i samo pomoću jezgre Java:

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

Razlog zašto ovo djeluje je taj u kutiji okreće svaki int u an Cijeli broj, koji čini implementirati Usporednik.

4.2. Objekti koji se provode usporedivi

Sortiranje polja objekata koji implementira Usporedive sučelje u padajućem redoslijedu prilično je jednostavno. Sve što trebamo je proći a Usporednik kao drugi parametar našeg vrsta metoda.

U Javi 8 možemo koristiti Usporednik.reverseOrder () kako bismo naznačili da bismo željeli da se naš niz sortira u opadajućem redoslijedu:

Arrays.sort (stringovi, Comparator.reverseOrder ()); assertArrayEquals (novi String [] {"sa", "učenje", "java", "baeldung"}, nizovi);

4.3. Objekti koji se ne provode usporedivi

Slično sortiranju objekata koji implementiraju usporedivo, možemo preokrenuti redoslijed svog običaja Usporednik dodavanjem obrnuto () na kraju naše usporedbene definicije:

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

5. Zaključak

U ovom smo članku razgovarali o tome kako sortirati nizove primitiva i objekata u rastućem i silaznom redoslijedu pomoću Nizovi.sort metoda.

Kao i obično, izvorni kod iz ovog članka može se naći na Githubu.