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がこれらの詳細をどのように私たちから隠すことができるかを見ていきます。しかし、JavaのAPIが適していない場合は、いつでもこの基本的なアルゴリズムに戻ることができます。

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

3最小の価値を見つける

  • java.util.stream.IntStream インターフェースは、 min メソッドを提供します。

整数を扱うだけなので、 min には Comparator は必要ありません。

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

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

    assertEquals(7, min);
}

Arrays stream staticメソッドを使用して Integer ストリームオブジェクトを作成したことに注目してください。各プリミティブ配列型に対応する stream メソッドがあります。

配列が空になる可能性があるので、 min Optionalを返します。したがって、 int に変換するには、 getAsInt__を使用します。

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

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

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

   //standard constructors, getters and setters
}

それから Stream APIを再び使用して、 __Car __sの配列の中で最速の車を見つけることができます。

@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 は、インタフェース java.util.stream.Stream <T> のインスタンスを返します。メソッド max には Comparator ** が必要です。

独自のカスタム Comparator を作成することもできますが、リンク:/java-8-コンパレータ - 比較[ Comparator.comparing ははるかに簡単です。

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

この値を get することも、 max が値を返さない場合に例外をスローする orElseThrow のように、 __Optional __sで他に可能なことをすべて行うこともできます。

5結論

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

このライブラリの詳細については、https://docs.oracle.com/javase/8/docs/api/java/util/stream/packages-summary.html[Oracleのドキュメント]を参照してください。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-java-8[GitHubに載って]を参照してください。