Javaで配列の最小値/最大値を見つける

Javaを使用して配列内の最小/最大を見つける

1. 前書き

この短いチュートリアルでは、Java 8のStream APIを使用して、配列内の最大値と最小値を見つける方法を説明します。

整数の配列で最小値を見つけることから始め、次にオブジェクトの配列で最大値を見つけます。

2. 概要

順序付けられていない配列で最小値または最大値を見つける方法は多数あり、それらはすべて次のようになります。

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

Java 8 can hide these details from usがどのようになっているのかを見ていきます。 ただし、JavaのAPIが適切でない場合は、いつでもこの基本的なアルゴリズムに戻ることができます。

配列内の各値をチェックする必要があるため、すべての実装はO(n)です。

3. 最小値を見つける

The java.util.stream.IntStream interface provides the min methodは、私たちの目的には問題なく機能します。

整数のみを処理しているため、minComparatorを必要としません。

@Test
public void whenArrayIsOfIntegerThenMinUsesIntegerComparator() {
    int[] integers = new int[] { 20, 98, 12, 7, 35 };

    int min = Arrays.stream(integers)
      .min()
      .getAsInt();

    assertEquals(7, min);
}

Arraysstream静的メソッドを使用してIntegerストリームオブジェクトを作成した方法に注目してください。 プリミティブ配列タイプごとに同等のstreamメソッドがあります。

配列が空である可能性があるため、minOptional,を返し、それをintに変換するために、getAsIntを使用します。

4. 最大のカスタムオブジェクトを見つける

簡単なPOJOを作成しましょう。

public class Car {
    private String model;
    private int topSpeed;

    // standard constructors, getters and setters
}

次に、Stream APIを再度使用して、Carsの配列から最速の車を見つけることができます。

@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);
}

この場合、Arraysの静的メソッドstreamは、the interface java.util.stream.Stream<T> where the method max requires a Comparatorのインスタンスを返します。

独自のカスタムComparatorを作成することもできますが、Comparator.comparing is much easier.

maxは、以前と同じ理由でOptionalインスタンスを返すことに再度注意してください。

この値をgetにすることも、maxが値を返さない場合に例外をスローするorElseThrowのように、Optionalsで可能なことは何でもすることができます。

5. 結論

この短い記事で、Java 8のStream APIを使用して、配列の最大値と最小値を見つけることがいかに簡単でコンパクトであるかを見ました。

このライブラリの詳細については、Oracle documentationを参照してください。

これらすべての例とコードスニペットの実装は、over on GitHubにあります。