Pronalaženje Min / Max u nizu s Javom

1. Uvod

U ovom kratkom vodiču vidjet ćemo kako pronaći maksimalne i minimalne vrijednosti u nizu, koristeći Javu 8 Stream API.

Počet ćemo s pronalaženjem minimuma u nizu cijelih brojeva, a zatim ćemo pronaći maksimum u nizu objekata.

2. Pregled

Postoji mnogo načina za pronalaženje min ili max vrijednosti u neuređenom nizu i svi oni izgledaju otprilike poput:

SET MAX na niz [0] FOR i = 1 na dužinu polja - 1 IF array [i]> MAX THEN SET MAX na niz [i] ENDIF ENDFOR

Idemo pogledati kako Java 8 može sakriti ove detalje od nas. Ali, u slučajevima kada nam Java-ov API ne odgovara, uvijek se možemo vratiti ovom osnovnom algoritmu.

Budući da moramo provjeriti svaku vrijednost u polju, sve su implementacije Na).

3. Pronalaženje najmanje vrijednosti

The java.util.stream.IntStream sučelje pruža min metoda to će sasvim dobro funkcionirati u naše svrhe.

Kako radimo samo s cijelim brojevima, min ne zahtijeva a Usporednik:

@Test public void whenArrayIsOfIntegerThenMinUsesIntegerComparator () {int [] integers = new int [] {20, 98, 12, 7, 35}; int min = Nizovi.stream (cijeli brojevi) .min () .getAsInt (); assertEquals (7, min); }

Primijetite kako smo stvorili Cijeli broj stream objekt pomoću potok statička metoda u Nizovi. Postoje ekvivalentne potok metode za svaki primitivni tip polja.

Budući da je niz mogao biti prazan, min vraća an Neobvezno, pa pretvoriti to u int, koristimo getAsInt.

4. Pronalaženje najvećeg prilagođenog objekta

Stvorimo jednostavan POJO:

model javne klase {model privatnog niza; private int topSpeed; // standardni konstruktori, getteri i postavljači}

A onda možemo koristiti Stream API ponovo za pronalaženje najbržeg automobila u nizu Automobils:

@Test public void whenArrayIsOfCustomTypeThenMaxUsesCustomComparator () {Car porsche = novi automobil ("Porsche 959", 319); Car ferrari = novi automobil ("Ferrari 288 GTO", 303); Car bugatti = novi automobil ("Bugatti Veyron 16.4 Super Sport", 415); Car mcLaren = novi automobil ("McLaren F1", 355); Automobil [] fastCars = {porsche, ferrari, bugatti, mcLaren}; Car maxBySpeed ​​= Arrays.stream (fastCars) .max (Comparator.comparing (Car :: getTopSpeed)) .orElseThrow (NoSuchElementException :: new); assertEquals (bugatti, maxBySpeed); }

U ovom slučaju, statička metoda potok od Nizovi vraća primjerak sučelje java.util.stream.Stream gdje metoda maks zahtijeva a Usporednik.

Mogli smo stvoriti vlastiti običaj Usporednik, ali Usporednik.usporedba je puno lakše.

Ponovno to primijetite maks vraća an Neobvezno primjerice iz istog razloga kao i prije.

Možemo i jedno i drugo dobiti ovu vrijednost, ili možemo učiniti sve što je moguće Neobveznos, kao iliElseThrow to donosi izuzetak ako maks ne vraća vrijednost.

5. Zaključak

U ovom kratkom članku vidjeli smo kako je lako i kompaktno pronaći max i min na nizu pomoću Stream API Java 8.

Za više informacija o ovoj knjižnici pogledajte Oracle dokumentaciju.

Provedbu svih ovih primjera i isječaka koda možete pronaći na GitHubu.