質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

213閲覧

Stream APIのmaxメソッドの動きについて

piko_piko_head

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2024/02/21 08:11

0

0

前提

Java Gold取得に向けて学習中です。
Stream APIのmaxメソッドについて、APIリファレンスを見ると
「指定されたComparatorに従ってこのストリームの最大要素を返します。」とありますが
最大要素というのは、並び替えた後の最後の要素、という意味でしょうか。

該当のソースコード

このコードを実行すると3が出力されますが

Java

1 public static void main(String[] args) { 2 List<Integer> list = Arrays.asList(1, 3, 2); 3 Optional<Integer> result = list.stream().max((a, b) -> a.compareTo(b)); 4 result.ifPresent(System.out::print); 5 }

a.compareTo(b)の部分をマイナス符号で反転させる、もしくはb.compareTo(a)にすると、1が出力されます。
これは自然順ではなく、降順で並び替え、その結果の最後の要素が1という理解であってますか。
minも同様の動きをします。

Java

1 public static void main(String[] args) { 2 List<Integer> list = Arrays.asList(1, 3, 2); 3 Optional<Integer> result = list.stream().max((a, b) -> -(a.compareTo(b))); 4 result.ifPresent(System.out::print); 5 }

試したこと

APIリファレンスを読みましたが、答えが明確になりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

min にしろ max にしろどれか一つを返すのですから並び替える必要は無いでしょう。
max は「自(a)他(b)を比較して全てで Comparator が正数を返すモノ」を探し、 min は「~ 負数を ~」ということです。
これは Comparator が二値を比較して a>b なら正数・ a<b なら負数・ 同じなら 0 を返すことが前提で、当然 Comparator にマイナス符号を付けて正負を反転させれば、結果として max は最小を返すことになり min は最大を返すことになります。

このようなことは、机上で解説を読んで勉強するよりも実際に最大値/最小値を探すプログラムや昇順/降順に並び替えるプログラムを作って動きを観察するほうが良いのではないでしょうか。

投稿2024/02/21 13:39

編集2024/02/21 13:43
jimbe

総合スコア13394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piko_piko_head

2024/02/21 14:16

jimbeさん、回答ありがとうございます。 完全に勘違いしていました。 Comparatorをsortメソッドに渡して、初めて並び替えられるのですね。 仰られるように並び替えや最大・最小値を求めるようなコードをいくつか書いてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問