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

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

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

Q&A

解決済

Comparatorのcompareについて

tatsuki
tatsuki

総合スコア1

2回答

0グッド

0クリップ

725閲覧

投稿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だとマイナスの整数が返ってくると思います。

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

YT0014

2022/04/08 03:01

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

回答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

総合スコア1600

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る