ストリームの max 関数は、ストリーム内の最大値を便利に識別します。ただし、「先着順」の原則に基づいて動作するため、同点の場合は他の最大値が除外される可能性があります。この制限に対処し、すべての最大値を取得するには、代替アプローチが必要です。
入力コレクションの場合、2 パス アプローチを使用できます。
このソリューションは複数の最大値に対応しますが、入力全体を 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 サイトの他の関連記事を参照してください。