Javaを使用した配列での最小/最大の検索

1.はじめに

この短いチュートリアルでは、我々は、Java 8の使用して、配列内の最大値と最小値を見つける方法を参照しようとしているストリーム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

Java8がこれらの詳細を私たちから隠す方法を見ていきます。ただし、JavaのAPIが適切でない場合は、いつでもこの基本的なアルゴリズムに戻ることができます。

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

3.最小値を見つける

java.util.stream.IntStreamのインタフェースは提供我々の目的のためにうまく動作します。

整数のみを扱っているので、minコンパレータを必要としません:

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

私たちが作成したかに注意してください整数使用してストリームオブジェクトをストリーム内の静的メソッド配列を。プリミティブ配列タイプごとに同等のストリームメソッドがあります。

配列が空である可能性があるため、minOptionalを返しますしたがってこれをintに変換するには、getAsIntを使用します

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

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

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

次に、Stream APIを再度使用して、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); }

この場合、配列の静的メソッドストリーム、メソッドmaxComparatorを必要とするインターフェイスjava.util.stream.Streamのインスタンスを返します。

独自のカスタムComparatorを作成することもできますが、Comparator.comparingの方がはるかに簡単です。

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

この値を取得するか、maxが値を返さない場合に例外をスローするorElseThrowなど、Optionalで可能な他の方法を実行できます。

5。結論

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

このライブラリの詳細は、Oracleのドキュメントを参照してください。

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