ホームページ > Java > &#&チュートリアル > Java ストリームからすべての最大値を取得するにはどうすればよいですか?

Java ストリームからすべての最大値を取得するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-08 13:33:11
オリジナル
600 人が閲覧しました

How to Get All Maximum Values from a Java Stream?

Java ストリームで複数の最大値を返す方法

Java Stream API では、max 関数は通常、次の最大要素の 1 つを返します。コンパレーターが提供されている場合はコレクション。しかし、すべての最大値が必要な場合、特に複数の要素が同じ最大値を持つ場合はどうなるでしょうか?

すべての最大値を返すためのトリック

残念ながら、Java API では、すべての最大値を取得する直接的な方法は提供されていません。ただし、回避策として、コレクターを使用して部分的な結果を保存することが必要になります。以下は、コンパレーターに基づいてコレクターを生成するヘルパー関数です。

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            int c;
            if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) {
                list.add(t);
            } else if (c > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            if (list1.isEmpty()) {
                return list2;
            } 
            if (list2.isEmpty()) {
                return list1;
            }
            int r = comp.compare(list1.get(0), list2.get(0));
            if (r < 0) {
                return list2;
            } else if (r > 0) {
                return list1;
            } else {
                list1.addAll(list2);
                return list1;
            }
        });
}
ログイン後にコピー

このコレクターは、コンパレーターに関して同等の要素のリストを維持します。結果をマージすると、コレクターはより大きな要素を含むリストを返します。要素が等しい場合、リストが追加されます。

ストリームでこのコレクタを使用するには、次のように適用するだけです:

Stream<String> input = ... ;

List<String> result = input.collect(maxList(comparing(String::length)));
ログイン後にコピー

使用例

たとえば、ファイル内の最大長の文字列をすべて見つけてみましょう。 list.

List<String> strings = Arrays.asList("apple", "banana", "pear", "orange", "grapes", "kiwi");

Stream<String> stringStream = strings.stream();

List<String> maxStrings = stringStream.collect(maxList(Comparator.comparingInt(String::length)));

System.out.println(maxStrings); // [apple, banana, grapes, orange]
ログイン後にコピー

この例では、maxList コレクターは、最大長のすべての文字列を含むリストを返します。

以上がJava ストリームからすべての最大値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート