Find Min / Max i en matrix med Java

1. Introduktion

I denne korte vejledning skal vi se, hvordan man finder maksimums- og minimumsværdierne i en matrix ved hjælp af Java 8'er Strøm API.

Vi starter med at finde minimumet i et array af heltal, og derefter finder vi det maksimale i et array af objekter.

2. Oversigt

Der er mange måder at finde min- eller max-værdien i et ikke-ordnet array, og de ser alle ud som:

INDSTIL MAX til array [0] FOR i = 1 til array længde - 1 IF array [i]> MAX DAN SÆT MAX til array [i] ENDIF ENDFOR

Vi skal se på hvordan Java 8 kan skjule disse detaljer for os. Men i tilfælde, hvor Java's API ikke passer os, kan vi altid gå tilbage til denne grundlæggende algoritme.

Fordi vi skal kontrollere hver værdi i arrayet, er alle implementeringer det På).

3. Find den mindste værdi

Det java.util.stream.IntStream interface giver min metode det fungerer fint til vores formål.

Da vi kun arbejder med heltal, min kræver ikke en Komparator:

@Test offentlig ugyldig nårArrayIsOfIntegerThenMinUsesIntegerComparator () {int [] heltal = ny int [] {20, 98, 12, 7, 35}; int min = Arrays.stream (heltal) .min () .getAsInt (); assertEquals (7, min); }

Bemærk hvordan vi oprettede Heltal streame objekt ved hjælp af strøm statisk metode i Arrays. Der er ækvivalente strøm metoder til hver primitive matrixtype.

Da matrixen kunne være tom, min returnerer en Valgfri, så at konvertere det til et int, vi bruger getAsInt.

4. Find det største brugerdefinerede objekt

Lad os oprette en simpel POJO:

offentlig klasse bil {privat streng model; privat int topSpeed; // standardkonstruktører, getters og settere}

Og så kan vi bruge Strøm API igen for at finde den hurtigste bil i en række Bils:

@Test offentlig ugyldigt nårArrayIsOfCustomTypeThenMaxUsesCustomComparator () {Car porsche = new Car ("Porsche 959", 319); Bilferrari = ny bil ("Ferrari 288 GTO", 303); Bil bugatti = ny bil ("Bugatti Veyron 16.4 Super Sport", 415); Bil mCLaren = ny bil ("McLaren F1", 355); Bil [] fastCars = {porsche, ferrari, bugatti, mcLaren}; Car maxBySpeed ​​= Arrays.stream (fastCars) .max (Comparator.comparing (Car :: getTopSpeed)) .orElseThrow (NoSuchElementException :: new); assertEquals (bugatti, maxBySpeed); }

I dette tilfælde er den statiske metode strøm af Arrays returnerer en forekomst af grænsefladen java.util.stream.Stream hvor metoden maks kræver en Komparator.

Vi kunne have konstrueret vores egen skik Komparator, men Comparator. Sammenligning er meget lettere.

Bemærk igen det maks returnerer en Valgfri eksempel af samme grund som før.

Vi kan enten denne værdi, eller vi kan gøre hvad der ellers er muligt med Valgfris, ligesom eller ElseTrow der kaster en undtagelse, hvis maks returnerer ikke en værdi.

5. Konklusion

Vi så i denne korte artikel, hvor let og kompakt det er at finde maks og min på en matrix ved hjælp af Strøm API til Java 8.

For mere information om dette bibliotek henvises til Oracle-dokumentationen.

Implementeringen af ​​alle disse eksempler og kodestykker findes på GitHub.