Hľadanie min / max v poli pomocou Java

1. Úvod

V tomto krátkom tutoriále sa dozvieme, ako nájsť maximálnu a minimálnu hodnotu v poli pomocou Java 8 Prúd API.

Začneme hľadaním minima v rade celých čísel a potom nájdeme maximum v rade objektov.

2. Prehľad

Existuje mnoho spôsobov, ako nájsť minimálnu alebo maximálnu hodnotu v neusporiadanom poli, a všetky vyzerajú asi takto:

NASTAVIŤ MAX do poľa [0] FOR i = 1 do dĺžky poľa - 1 AK pole [i]> MAX POTOM nastaviť MAX do poľa [i] ENDIF ENDFOR

Ideme sa pozrieť ako Java 8 môže tieto podrobnosti pred nami skryť. Ale v prípadoch, keď nám Java API nevyhovuje, sa môžeme kedykoľvek vrátiť k tomuto základnému algoritmu.

Pretože musíme skontrolovať každú hodnotu v poli, sú všetky implementácie O (n).

3. Nájdenie najmenšej hodnoty

The java.util.stream.IntStream rozhranie poskytuje min metóda to bude fungovať dobre pre naše účely.

Pretože pracujeme iba s celými číslami, min nevyžaduje a Komparátor:

@Test public void whenArrayIsOfIntegerThenMinUsesIntegerComparator () {int [] integers = new int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (celé čísla) .min () .getAsInt (); assertEquals (7, min); }

Všimnite si, ako sme vytvorili Celé číslo streamujte objekt pomocou Prúd statická metóda v Polia. Existujú rovnocenné Prúd metódy pre každý typ primitívneho poľa.

Pretože pole môže byť prázdne, min vracia Voliteľné, takže previesť, že na int, používame getAsInt.

4. Nájdenie najväčšieho vlastného objektu

Vytvorme jednoduché POJO:

public class Car {private String model; private int topSpeed; // štandardné konštruktory, getre a setre}

A potom môžeme použiť Prúd API opäť nájsť najrýchlejšie auto v rade Autos:

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

V tomto prípade statická metóda Prúd z Polia vráti inštanciu rozhranie java.util.stream.Stream kde metóda max vyžaduje a Komparátor.

Mohli sme si skonštruovať svoj vlastný zvyk Komparátor, ale Comparator.comparing je oveľa jednoduchšie.

Znova si všimnite, že max vracia Voliteľné napríklad z rovnakého dôvodu ako predtým.

Môžeme buď dostať túto hodnotu, alebo môžeme robiť všetko, čo je možné Voliteľnés, ako aleboElseThrow že vyvolá výnimku, ak max nevracia hodnotu.

5. Záver

V tomto krátkom článku sme videli, aké ľahké a kompaktné je nájsť maximálnu a minimálnu hodnotu v poli pomocou znaku Prúd API Java 8.

Viac informácií o tejto knižnici nájdete v dokumentácii Oracle.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na GitHub.