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

Java ストリームからすべての最大値を取得し、タイを効果的に処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-14 14:45:16505ブラウズ

How Can I Retrieve All Maximum Values from a Java Stream, Handling Ties Effectively?

すべての最大値を返す Java ストリームの制限を克服する

ストリームの max 関数は、ストリーム内の最大値を便利に識別します。ただし、「先着順」の原則に基づいて動作するため、同点の場合は他の最大値が除外される可能性があります。この制限に対処し、すべての最大値を取得するには、代替アプローチが必要です。

2 パス ソリューション

入力コレクションの場合、2 パス アプローチを使用できます。

  1. 整数の長さの max を使用して最大値を決定します。
  2. コレクションをフィルターして、最大値を持つすべての文字列を取得します。 length.

このソリューションは複数の最大値に対応しますが、入力全体を 2 回繰り返すコストが発生します。

シングルパス コレクター

入力がストリームでは、シングルパス コレクターを利用できます。

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            if (list.isEmpty() || comp.compare(t, list.get(0)) == 0) {
                list.add(t);
            } else if (comp.compare(t, list.get(0)) > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            ...
            // Compare and merge lists based on maximum values
        }
    );
}

このコレクターは、次の不変条件を維持します。等価性を確認し、必要に応じて要素を追加または削除します。リストをマージする場合、それぞれの最大要素が考慮され、等しい場合にそれらが結合されます。

このコレクターをストリームと組み合わせることで、すべての最大値を 1 回のパスで取得できます。

結論

Java ストリームの max には制限がありますが、代替ソリューションを利用して制限を克服できます。 2 パス ソリューションはコレクションには効率的ですが、シングルパス コレクターはストリームに有用であることが証明されており、すべての最大値を取得できます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。