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に載って]を参照してください。