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

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

ただいまの
回答率

88.91%

compareToの使い方を教えて欲しい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,823

k499778

score 542

現在Java Goldの問題を解いていてわからないところがあります。
以下の問題なのですが、compareToメソッドのところで、どこをどのように見たら「変数Noの値を昇順でソートする」というように判断できるのでしょうか?

Java Gold SE7 スピードマスター問題集 問題70

いまいちこのcompareToの使い方の例が検索しても見つからず困っています。
compareTOメソッドの中でcompareToメソッドを使っているので。

もしアドバイスいただける方がいればよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

... どこをどのように見たら「変数Noの値を昇順でソートする」というように判断できるのでしょうか?

この部分で, Fruit は、 no の昇順でソートされることがわかります、

public int compareTo(Fruit f) {
  Integer i = no;
  return i.compareTo(f.no);
}

`
すぐにわかるのは、 Fruit の no を大小判定につかっていることです。
そして、 i.compareTo(f.no) としているので、昇順にソートされるということがわかります。
これを (-1) * i.compareTo(f.no) とすれば、降順になります。

Fruit の nama でのソートに変更したい場合は、
return name.compareTo(f.name);
とします。

元のコードでは, no だけで大小判定しているので、
no は同じだけど name が違う Frout がある場合は、ソート結果がどうなるかは予測できません。
no が同じ場合は、name で大小判定するというように、コードを修正したほうが良いかもしれません。

... compareTOメソッドの中でcompareToメソッドを使っている ...

Fruit の大小判定メソッド(compareTo) の中で、 Integer の大小判定メソッド(compareTo)
をつかっているのです。
i.compareTo(f.no) を使わずに、return i - f.no; 
としてもよいです。

参考情報:

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 07:54

    >i.compareTo(f.no) を使わずに、return i - f.no; としてもよいです。
    final int x = Integer.MAX_VALUE;
    final int y = Integer.MIN_VALUE;
    int comp1 = x - y;
    int comp2 = Integer.valueOf(x).compareTo(y);
    System.out.println(comp1);
    System.out.println(comp2);
    --
    実行結果
    -1
    1

    キャンセル

  • 2017/04/29 08:33

    回答ありがとうございます。
    「Fruit の大小判定メソッド(compareTo)」と,Integer の大小判定メソッド(compareTo) は処理の内容が異なるのですね。大元はComparableインターフェイスというのは同じであれ。
    compareToで降順にする方法もわかりました。
    わかりやすく教えていただきありがとうございます。

    キャンセル

  • 2017/04/29 19:47

    降順にする場合は、comparatoe をいじるのではなく、reversed() を使います。
    (↑の回答では、compartor の return 値の正負が逆転したらどうなるかを示したかっただけ。降順ソートを方法を示したかったわけではありません)

    参考 http://javatechnology.net/java/string-array-sort-yomi/
    ava8でのComparatorの使い方

    キャンセル

  • 2017/05/03 10:45

    返答ありがとうございます。
    reversed()を使うのですね。理解しました。追記していただきありがとうございました。

    キャンセル

+2

A.compareTo(B)は、
A<B(Aが先に並ぶ)の時負の値を、
A=B(AとBが同じ値)の時0を、
A>B(Bが先に並ぶ)の時正の値を
返すように定めます。
ソートメソッドを使う時に、内部ではこのメソッドの返り値の符号によって、
2つのオブジェクトの大小(つまり、どちらが先に並ぶか)を判定しています。

IntegerのcompareToは、もちろん数値の小さいほうが先に並ぶと判定するように設計されています。
そしてこのFruitクラスの大小関係を決めるcompateToは、
thisのnoと比較対象のnoの大小関係と同じだということを表しています。
そのため、変数noの昇順になるように並びます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/29 02:45

    返答ありがとうございます。
    前者の回答に関して承知いたしました。

    >質問の意味を掴みかねます。
    同じようにソート順を設定するComparatorインタフェースのcompareメソッドでは
    return emp2.getId() - emp1.getId(); なら降順、
    return emp1.getId() - emp2.getId(); なら昇順といったように、
    returnの差を入れ替えることによって、降順・昇順に切り替えることができたので、

    compareToも同様に切り替えることができるのかと思ったのですが、
    実際にコードを書いてみたり、
    「IntegerのcompareToは、もちろん数値の小さいほうが先に並ぶと判定するように設計されています。 」
    といった説明もあることから
    どうも昇順だけしか設定できないのかもしれないと思ったのでそのような質問をいたしました。

    compareToは昇順だけしか設定できないという認識は正しいでしょうか。

    キャンセル

  • 2017/04/29 02:51

    Comparable#compareToも、Comparator#compareも、「どちらがより早い順番に並ぶか」を決めるルールを定めているにすぎません。小さいほうが先に並ぶように定めれば昇順になりますし、大きいほうが先に並ぶように定めれば降順になるだけです。
    それをドキュメントでは「小さい/大きい」で表現されているだけです。

    キャンセル

  • 2017/04/29 08:18

    返答ありがとうございます。精進します!

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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