- ベストアンサー
Javaのオブジェクトのソート方法について
Javaに関する質問です。 配列を用いてオブジェクトをつくり、そのフィールドの内容を用いて配列のオブジェクトをソートしたいのですが、どのようにプログラミングをすればよいのでしょうか? 方法をご存知の方がおりましたら、解答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
以下のようにCarComparatorを定義してやると、 java.util.Arrays.sortによりソートが可能になります。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; class Car { int num; //ナンバー double gas; //ガソリン量 // Carクラスの文字列表現を与える public String toString() { return "number:" + num + " gasoline:" + gas; } } // Carクラスの比較を行う class CarComparator implements Comparator<Car> { public int compare(Car c1 , Car c2) { return c1.num - c2.num; // この場合、numの昇順に並べる } } class Sample { private final static int CARS = 3; // 車の台数 public static void main(String [] args) { Car car[] = new Car[CARS]; BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); try { for(int i=0; i<CARS; i++){ car[i] = new Car(); System.out.println(i + "番の車の情報を入力してください。"); System.out.println("ナンバーを入力してください。"); String str2 = br2.readLine(); System.out.println("ガソリン量を入力してください。"); String str3 = br2.readLine(); int a = Integer.parseInt(str2); int b = Integer.parseInt(str3); car[i].num = a; car[i].gas = b; } } catch(IOException e) { e.printStackTrace(); } System.out.println("before sort."); for(int i=0 ; i<CARS ; i++) { System.out.println(car[i]); } Arrays.sort(car , new CarComparator()); // sort実行 System.out.println("after sort."); for(int i=0 ; i<CARS ; i++) { System.out.println(car[i]); } } }
その他の回答 (3)
- koko_u_
- ベストアンサー率18% (459/2509)
>実行結果が以下のようにソートされていない状態で出てきてしまいます。 入力の時点で既にソート済みなんですが。。。
お礼
すみませんでした。勘違いしてました。なぜかガソリン量の方をみていました。大変失礼いたしました。本当にすみません。 問題を解決でき、本当に感謝しています。どうもありがとうございました。またわからないことが出てきて質問することがあると思います。そのときには、また回答していただけるとうれしいです。 今回はご迷惑をおかけし、すみませんでした。ありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
偉そうに回答してるけど、ぢつは Java の文法は知らんので、 書き方は自分で調べてもらうとして。 Car を比較できるように定義して下さい。 Comparable<T> インターフェイスを実装するか、別途 Comparator<T> を作成して下さい。 いずれにせよ、比較方法を Car に与えれば、後は sort 関数が勝手にその Comparator に従ってソートしてくれます。
お礼
ありがとうございました。もう少し考えてみます。
- koko_u_
- ベストアンサー率18% (459/2509)
>配列を用いてオブジェクトをつくり オブジェクトの配列をソートしたいということですか?? それなら java.util.Array の sort メソッドに適当な比較演算子を渡せば良いのでは? --- ドキュメントから引用 --- public static <T> void sort(T[] a, Comparator<? super T> c) 指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートします。 配列のすべての要素は、指定されたコンパレータで「相互に比較可能」でなければいけません。 ----------------------------
お礼
わかりにくい質問に対して、迅速な回答ありがとうございます。 プログラミング経験もほぼなく、Java初心者なので、いろいろわからないことだらけです。 今回の質問の内容なのですが、もう一度やりたいことを下に書いてみるので、もしもお答えして頂けるようでしたら、お願いします。 class Car { int num; //ナンバー double gas; //ガソリン量 } というものをつくり、メインメソッドで、 Car car[]; car = new Car[4]; for(int i=1; i<=3; i++){ car[i] = new Car(); BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); System.out.println(i + "番の車の情報を入力してください。"); System.out.println("ナンバーを入力してください。"); String str2 = br2.readLine(); System.out.println("ガソリン量を入力してください。"); String str3 = br2.readLine(); int a = Integer.parseInt(str2); int b = Integer.parseInt(str3); car[i].num = a; car[i].gas = b; } というものを作ったのですが、このnumの大きいものから順にcar[1], car[2], car[3]と並べ替えたいのです。 どうでしょうか。 よろしくお願いします。
補足
御礼が遅くなり大変失礼しました。ソースまで書いていただき、大変助かりました。親切なご回答ありがとうございます。 早速サンプルプログラムを実行させてみたのですが、実行結果が以下のようにソートされていない状態で出てきてしまいます。理由がわからないので、もしよろしければ教えてください。よろしくお願いします。 before sort. number:123 gasoline:22.0 number:456 gasoline:55.0 number:789 gasoline:33.0 after sort. number:123 gasoline:22.0 number:456 gasoline:55.0 number:789 gasoline:33.0