Mencari Min / Max dalam Array dengan Java

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat bagaimana mencari nilai maksimum dan minimum dalam array, menggunakan Java 8's Stream API.

Kita akan mulakan dengan mencari minimum dalam array bilangan bulat, dan kemudian kita akan mencari maksimum dalam array objek.

2. Gambaran keseluruhan

Terdapat banyak cara untuk mencari nilai min atau maksimum dalam susunan yang tidak tersusun, dan semuanya kelihatan seperti:

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

Kami akan melihat bagaimana Java 8 dapat menyembunyikan butiran ini dari kami . Tetapi, sekiranya API Java tidak sesuai dengan kita, kita selalu dapat kembali ke algoritma asas ini.

Kerana kita perlu memeriksa setiap nilai dalam array, semua implementasi adalah O (n) .

3. Mencari Nilai Terkecil

Antara muka java.util.stream.IntStream menyediakan kaedah min yang akan berfungsi dengan baik untuk tujuan kita.

Oleh kerana kami hanya bekerja dengan bilangan bulat, min tidak memerlukan Perbandingan :

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

Perhatikan bagaimana kita membuat objek aliran Integer menggunakan kaedah statis aliran dalam Susunan . Terdapat kaedah aliran setara untuk setiap jenis array primitif.

Oleh kerana array boleh kosong, min mengembalikan Opsional, jadi untuk mengubahnya menjadi int , kami menggunakan getAsInt .

4. Mencari Objek Tersuai Terbesar

Mari buat POJO ringkas:

public class Car { private String model; private int topSpeed; // standard constructors, getters and setters }

Dan kemudian kita dapat menggunakan Stream API lagi untuk mencari kereta terpantas dalam pelbagai Car :

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

Dalam kes ini, statik kaedah aliran untuk Tatasusunan mengembalikan contoh antara muka java.util.stream.Stream mana kaedah max memerlukan Comparator .

Kami mungkin telah membina Comparator tersuai kami sendiri , tetapi perbandingan Comparator.com jauh lebih mudah.

Perhatikan lagi bahawa max mengembalikan contoh Pilihan dengan alasan yang sama seperti sebelumnya.

Kita boleh mendapatkan nilai ini, atau kita boleh melakukan apa sahaja yang mungkin dengan Opsional , seperti orElseThrow yang membuang pengecualian jika max tidak mengembalikan nilai.

5. Kesimpulan

Kami melihat dalam artikel pendek ini betapa mudah dan padatnya mencari maksimum dan min pada array, menggunakan Stream API dari Java 8.

Untuk maklumat lebih lanjut mengenai perpustakaan ini, sila rujuk dokumentasi Oracle.

Pelaksanaan semua contoh dan coretan kod ini boleh didapati di GitHub.