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.