Min / Max zoeken in een array met Java

1. Inleiding

In deze korte tutorial gaan we zien hoe we de maximum- en minimumwaarden in een array kunnen vinden met behulp van Java 8's Stroom API.

We beginnen met het vinden van het minimum in een reeks gehele getallen, en dan vinden we het maximum in een reeks objecten.

2. Overzicht

Er zijn veel manieren om de min- of max-waarde in een ongeordende array te vinden, en ze zien er allemaal ongeveer zo uit:

SET MAX op array [0] FOR i = 1 op array-lengte - 1 IF array [i]> MAX THEN SET MAX op array [i] ENDIF ENDFOR

We gaan kijken hoe Java 8 kan deze details voor ons verbergen. Maar in gevallen waarin Java's API niet bij ons past, kunnen we altijd teruggaan naar dit basisalgoritme.

Omdat we elke waarde in de array moeten controleren, zijn alle implementaties Aan).

3. De kleinste waarde vinden

De java.util.stream.IntStream interface biedt de min methode dat werkt prima voor onze doeleinden.

Omdat we alleen met gehele getallen werken, min vereist geen Comparator:

@Test openbare leegte whenArrayIsOfIntegerThenMinUsesIntegerComparator () {int [] gehele getallen = nieuwe int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (gehele getallen) .min () .getAsInt (); assertEquals (7, min); }

Merk op hoe we het Geheel getal stream-object met behulp van de stroom statische methode in Arrays. Er zijn gelijkwaardige stroom methoden voor elk primitief array-type.

Omdat de array leeg kan zijn, min geeft een Optioneel, dus om dat om te zetten in een int, we gebruiken getAsInt.

4. Het grootste aangepaste object zoeken

Laten we een eenvoudige POJO maken:

openbare klasse Car {privé String-model; privé int topSpeed; // standaard constructeurs, getters en setters}

En dan kunnen we de Stroom API opnieuw om de snelste auto in een reeks Autos:

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

In dit geval de statische methode stroom van Arrays geeft een exemplaar terug van de interface java.util.stream.Stream waar de methode max. hoogte heeft nodig Comparator.

We hadden onze eigen gewoonte kunnen construeren Comparator, maar Comparator.comparing is veel gemakkelijker.

Merk nogmaals op dat max. hoogte geeft een Optioneel bijvoorbeeld om dezelfde reden als hiervoor.

Wij kunnen het ook krijgen deze waarde, of we kunnen er alles mee doen wat mogelijk is Optioneels, zoals orElseThrow dat gooit een uitzondering als max. hoogte geeft geen waarde terug.

5. Conclusie

We hebben in dit korte artikel gezien hoe gemakkelijk en compact het is om max en min op een array te vinden met behulp van de Stroom API van Java 8.

Raadpleeg de Oracle-documentatie voor meer informatie over deze bibliotheek.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op GitHub.