質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

2回答

1259閲覧

Comparatorのcompareについて

tatsuki

総合スコア1

0グッド

0クリップ

投稿2022/04/07 12:39

java

1import java.util.ArrayList; 2import java.util.Collections; 3import java.util.Comparator; 4import java.util.List; 5 6public class SampleClass { 7 public static void main(String[] args) { 8 List<Integer> list = new ArrayList<Integer>(); 9 list.add(5); 10 list.add(3); 11 list.add(100); 12 list.add(40); 13 list.add(2); 14 15 Comparator<Integer> comparator = new Comparator<Integer>() { 16 @Override 17 public int compare(Integer o1, Integer o2) { 18 return Integer.valueOf(o1).compareTo(Integer.valueOf(o2)); 19 } 20 }; 21 22 Collections.sort(list, comparator); 23 24 System.out.println(list); 25 } 26}

引用:https://techacademy.jp/magazine/34841

javaを勉強し始めて間もないものですがcompareについて質問があります。

①上記のコードのcompareメソッドの引数には何が渡されますか?

②sortメソッドの第一引数はcompareメソッドの戻り値がプラスの整数なら昇順、マイナスの整数なら降順になるのは何故ですか?

③compareメソッド「return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));」はプラスの整数をかえし、「return Integer.valueOf(o2).compareTo(Integer.valueOf(o1));」はマイナスの整数を返すと見ました。しかし、compareの引数次第で変わってくると思います。こちらのサイトで見ました。(https://ito-u-oti.com/post-611/)
例えば「return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));」これだとo1=2,o2=5だとマイナスの整数が返ってくると思います。

質問自体初めてなので至らないところがあるかと思いますがよろしくお願いします。

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

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

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

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

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

YT0014

2022/04/08 03:01

タグ「Jinja」ですが、「Java」の誤りではありませんか?
guest

回答2

0

ベストアンサー

「List に並び替える対象の数字を追加し、Collections.sort(list) に渡せば並び替えができる」ということであれば、質問者の方も疑問を感じなかったと思います。しかし途中で出てくる Comparator が何のことか分からず理解に苦しむのはごく自然な反応です。これは質問者の方だけでなく、多くの技術者が最初に感じる疑問でもあります。

以前、私は質問者の方と同じような疑問を持った初心者の方に回答を書いたことがあります。
初心者の方向けには難しい内容ですが、なぜ Comparator が必要なのかを解説しています(回答では Comparable になっていますが、質問者さんの疑問に応えるのに大きな違いではありません)。

「頭から逐一理解しながら読み進める」というよりは、ざっと目を通し「Comparator はソートの処理に組み込まれた部品の一部」とのイメージで捉えることができれば、まずは良いかと考えます。そして今後 Java に慣れてきたら再度読み返してみてください。理解できれば柔軟な共通処理の作り方について理解できるかと思います。

質問 - Java:インスタンスの並び替えの仕組みについて
回答No.2

投稿2022/04/12 18:18

編集2022/04/12 18:35
Mirko_Mug_Cup

総合スコア53

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

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

0

まずは、ソート処理の概要の理解が必要です。
一般的なソート処理は、以下のような形になります。
1.比較する要素を2つ選択する。
2.1の要素を比較した結果に基づき、入れ替えを行う。
3.ソートが終わるまで以上を繰り返す。

この2において、compare()メソッドが使用されるため、1回のソートにおいて、複数回呼ばれます。

①上記のコードのcompareメソッドの引数には何が渡されますか?

 この答えは、リストの要素のうち、様々な組合せが渡されます、です。

②sortメソッドの第一引数はcompareメソッドの戻り値がプラスの整数なら昇順、マイナスの整数なら降順になるのは何故ですか?

 これは、そもそも、複数回呼ばれるので、通常、プラスもマイナスも返すことになり、誤りです。
正しくは、大小関係をそのまま返せば昇順、逆転して返せば降順、とでも言うべきでしょうか。
今回のコードで言えば、前者がご提示のコード、後者が以下です。

Java

1 public int compare(Integer o1, Integer o2) { 2 int compareTo = Integer.valueOf(o1).compareTo(Integer.valueOf(o2)); 3 return - compareTo; 4 }

③compareメソッド「return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));」はプラスの整数をかえし、(後略)

 これに関しては、既に説明済みです。

補足
ご提示のcompare()ですが、冗長過ぎます。まず、Integer.valueOf()の仕様をご確認ください。

intとIntegerは、相互に変換可能ですが、別ものなので、ご提示のコードは、Javaコンパイラでは、以下のように解釈されます。

Java

1 // Integer.valueOf(o1); 2 int o1Int = o1.intValue(); 3 Integer o1Integer = Integer.valueOf(o1Int);

Integerをintに変換してから、再度、Integerに変換しています。
素直に書けば、

Java

1 public int compare(Integer o1, Integer o2) { 2 return o1.compareTo(o2); 3 }

となります。

きちんと自分の知識にしたいのなら、初心者の間は、各クラスの対応バージョンの公式ドキュメント(Oracleなど)を確認されることをお勧めします。

投稿2022/04/09 00:45

YT0014

総合スコア1708

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問