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

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

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

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

Q&A

解決済

2回答

903閲覧

Javaのソートについて

nakz

総合スコア15

Java

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

0グッド

0クリップ

投稿2018/12/27 05:28

このサンプルコードの
[12]のreturn this.number() - car.number();
がどういう処理をしているのかがわからないです。
何故、何を引き算しているんでしょう?

import java.util.ArrayList; import java.util.Collections; public class CollectionsSortWithoutComparator { public static void main(String[] args) { ArrayList <CarImplementedComparable>list = new ArrayList<CarImplementedComparable>();//[1] list.add(new CarImplementedComparable(105, "red"));//[2] list.add(new CarImplementedComparable(102, "blue"));//[3] list.add(new CarImplementedComparable(101, "green"));//[4] list.add(new CarImplementedComparable(104, "yellow"));//[5] list.add(new CarImplementedComparable(103, "black"));//[6] Collections.sort(list);//[7] for (CarImplementedComparable carNumber: list) {//[8] System.out.print("[9] Car Number = " + carNumber.number());//[9] System.out.println(", Cokor = " + carNumber.color()); } } } public class CarImplementedComparable implements Comparable<CarImplementedComparable> {//[20] private int number;//[21] private String color;//[22] public CarImplementedComparable(int number, String color) {//[23] this.number = number;//[24] this.color = color;//[25] } public int number() {//[26] return this.number;//[27] } public String color() {//[28] return this.color;//[29] } @Override public int compareTo( CarImplementedComparable car ){//[11] return this.number() - car.number();//[12] } }

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

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

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

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

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

guest

回答2

0

既に回答がついているとおり、『そのように実装する決まりだから』です。
とは言え随分分かりづらいですから、私なら次のように書きます。

Java

1@Override 2public int compareTo(CarImplementedComparable car) { 3 return Integer.compare(this.number, car.number); 4}

あるいはコンパレータを使います。(そもそも『比較できる車』って何なんだ)
ついでにtoStringをオーバーライドすると、次のように書けます。

Java

1import java.util.ArrayList; 2import java.util.Comparator; 3import java.util.List; 4 5 6class Main { 7 public static void main(String[] args) { 8 List<Car> list = new ArrayList<>(); 9 list.add(new Car(105, "red")); 10 list.add(new Car(102, "blue")); 11 list.add(new Car(101, "green")); 12 list.add(new Car(104, "yellow")); 13 list.add(new Car(103, "black")); 14 15 list.sort(Comparator.comparing(Car::getNumber)); 16 for(Car car: list) { 17 System.out.println(car); 18 } 19 } 20} 21 22class Car { 23 private int number; 24 private String color; 25 26 public Car(int number, String color) { 27 this.number = number; 28 this.color = color; 29 } 30 public int getNumber() { 31 return this.number; 32 } 33 public String getColor() { 34 return this.color; 35 } 36 37 @Override 38 public String toString() { 39 return String.format( 40 "Car Number = %d, color = %s.", number, color 41 ); 42 } 43}

もっと改造して良いならmainメソッドはこう書きます。だいぶスッキリします。

Java

1class Main { 2 public static void main(String[] args) { 3 var list = List.of( 4 new Car(105, "red"), new Car(102, "blue"), new Car(101, "green"), 5 new Car(104, "yellow"), new Car(103, "black") 6 ); 7 8 list.stream() 9 .sorted(Comparator.comparing(Car::getNumber)) 10 .forEach(System.out::println) 11 ; 12 } 13}

varに依る型省略はJava10以降の、List.ofはJava9以降の、Stream処理はJava8以降の機能です。

投稿2018/12/27 05:59

LouiS0616

総合スコア35660

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

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

0

ベストアンサー

まんまリファレンスの言葉ですが、

このオブジェクトが指定されたオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数を返します。

ということだからです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Comparable.html#compareTo-T-

投稿2018/12/27 05:31

編集2018/12/28 02:13
dice142

総合スコア5158

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

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

swordone

2018/12/27 13:41

[]と()の中身逆じゃないかい
dice142

2018/12/28 02:15

ご指摘ありがとうございます。 投稿中に( )内を間違えていたので修正したはずなのですが、teratailのバグなのか反映されてなかったです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問