• ベストアンサー

Javaのオブジェクトのソート方法について

Javaに関する質問です。 配列を用いてオブジェクトをつくり、そのフィールドの内容を用いて配列のオブジェクトをソートしたいのですが、どのようにプログラミングをすればよいのでしょうか? 方法をご存知の方がおりましたら、解答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.3

以下のように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]); } } }

hirox00
質問者

補足

御礼が遅くなり大変失礼しました。ソースまで書いていただき、大変助かりました。親切なご回答ありがとうございます。 早速サンプルプログラムを実行させてみたのですが、実行結果が以下のようにソートされていない状態で出てきてしまいます。理由がわからないので、もしよろしければ教えてください。よろしくお願いします。 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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>実行結果が以下のようにソートされていない状態で出てきてしまいます。 入力の時点で既にソート済みなんですが。。。

hirox00
質問者

お礼

すみませんでした。勘違いしてました。なぜかガソリン量の方をみていました。大変失礼いたしました。本当にすみません。 問題を解決でき、本当に感謝しています。どうもありがとうございました。またわからないことが出てきて質問することがあると思います。そのときには、また回答していただけるとうれしいです。 今回はご迷惑をおかけし、すみませんでした。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

偉そうに回答してるけど、ぢつは Java の文法は知らんので、 書き方は自分で調べてもらうとして。 Car を比較できるように定義して下さい。 Comparable<T> インターフェイスを実装するか、別途 Comparator<T> を作成して下さい。 いずれにせよ、比較方法を Car に与えれば、後は sort 関数が勝手にその Comparator に従ってソートしてくれます。

hirox00
質問者

お礼

ありがとうございました。もう少し考えてみます。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>配列を用いてオブジェクトをつくり オブジェクトの配列をソートしたいということですか?? それなら java.util.Array の sort メソッドに適当な比較演算子を渡せば良いのでは? --- ドキュメントから引用 --- public static <T> void sort(T[] a, Comparator<? super T> c) 指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートします。 配列のすべての要素は、指定されたコンパレータで「相互に比較可能」でなければいけません。 ----------------------------

hirox00
質問者

お礼

わかりにくい質問に対して、迅速な回答ありがとうございます。 プログラミング経験もほぼなく、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]と並べ替えたいのです。 どうでしょうか。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • java ソート

    java ソート ソートプログラムを作ってみましょう ? double型の配列とメソッドを持つクラスを定義 ? コンストラクタで配列を初期化(0.0で初期化) ?配列を昇順,降順に並び替えるメソッドを持つこと ? 2種類のメソッドを持っても良い ? 引数の値で変えても良い ? ソート済み配列をチェックするメソッドを持つこと ? 1000000要素程度のソーティングで時間計測 課題です 全く手が出せず困ってます・・・。 ヒント、手順、解答 なんでも良いので、救いの手をお願いします!!

  • JAVAのオブジェクト配列とは何でしょうか

    JAVAのオブジェクト配列とは何でしょうか ネットでいろいろ調べてみたのですが、あまり掲載がなくて・・・ また普通の配列を使うより何かメリットがあるでしょうか

  • ★Java1.5 オブジェクトのソートについて ソートキーを2つ指定する方法★

    困っています。ご存知の方教えてください。 リスト(ArrayList<UserBean>)の中に、 以下の用に2つのプロパティを持つBeanオブジェクトがが複数入っています。 --------------- UserBean{ private String name; private String no; // setter getter は省略 } --------------- このリストの中に入っているオブジェクトをソートしたいのですが、うまい方法が見つかりません。 また、ソートを行うにあたって2つのキーを指定してソートしたいです。 (第1優先Key = name 第2優先Key = no) keyが1つのソートであれば、jakarta commonsのクラスを利用して、このように (Collections.sort( list , new BeanComparator("name"));) ソートできたのですが、 ソートキー2つとなると手が止まってしまいました・・・。 commonsのクラスで2つキーを指定する方法もあるのでしょうか。 簡潔にオブジェクトをソートできる方法ご存知の方いましたらご教授下さい。 お願いいたします。

    • ベストアンサー
    • Java
  • Javaで2次元配列で文字によるソート方法

    2次元配列を使用して、上の図のような配列を下のように文字にってソートしたいのですが、やり方が分かりません。 ちなみに、すべて文字型です。 どなたかJavaによるコードを教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaでリストオブジェクト連結するプログラム

    Javaプログラミングについて質問です。 2つのリストオブジェクトを連結して、新規のリストオブジェクトを生成する関数と、 Dateオブジェクトをフォーマットし、String型に変換する関数を独自に作りたいのですが どうすればいいでしょうか? Java勉強し始めたばかりなので、どのようにソースを記述すればいいか分かりません。

    • ベストアンサー
    • Java
  • java 配列のソートについて

    JAVAを現在独学で勉強中ですが、わからないコードがあります。 プログラミングの先輩方、暇なときにでも教えてください。 for(int i=0; i<test.length; i++){ String str =br.readLine(); test[i] =Integer.parseInt(str); } for(int s=0;s<test.length-1;s++){ for(int t=s+1; t<test.length;t++){ if(test[t]>test[s]){ int tmp =test[t]; test[t] =test[s]; test[s]=tmp } } } 2回目のtest.length-1の-1はどういった役割を果たしてるんでしょうか? またjavaの構文の中でも、配列のソートがどうしても苦手です。 何かソートを理解するのにコツみたいなものがあれば、ご教授ください。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Javaのソートに関する質問です。

    Javaのソートに関する質問です。 CSVから取得したデータの一つをキーとして降順にソートしたいのでしょうが、どのような方法が効果的でしょうか?関数が利用できるのであれば関数を使用したいのですが。。。 データの詳細を以下に記載します。 環境 JavaSE5.0 CSVデータ ※ソート条件 ・キー内容は「wwwwwwww-xxxxxxxx-yyyyyyyy-zzzzzzzz」という形式で、 「wwwwwwww」が1番、「xxxxxxxx」が2番、というように、左側の数値が優先されます。 (ソート前)キー内容 タイトル 11111111-22222222-33333333-4444444 テスト1 22222222-33333333-44444444-5555555 テスト2 11111111-00000000-22222222-3333333 テスト3 22222222-44444444-55555555-6666666 テスト4 (ソート後)キー内容 タイトル 11111111-00000000-22222222-3333333 テスト3 11111111-22222222-33333333-4444444 テスト1 22222222-33333333-44444444-5555555 テスト2 22222222-44444444-55555555-6666666 テスト4

  • JavaのObjectからintへの型変換について

    JavaのObject[][]からint[][]への型変換について、質問があります。 Jtableの表の中身を構成する要素【Object[][]】を取り出し、一部をint[][]として数字の条件と比較したいと考えております。 Object型の配列を簡単にintに変換できる方法は例えばどの様なものがあるのでしょうか? 教えていただけるとありがたいです。

    • ベストアンサー
    • Java
  • JavaのRandomAccessFileについて教えてください。

    お世話になります。  Java(アプレットとして使用しています。)を最近から勉強し 始めました。  現在、作成しようとしているプログラムは、C言語で言うところの 構造体の項目をバイナリファイル内の任意の位置に読み書きしたいと 思っております。  現在、Javaでは、構造体の概念が見当たらなかったので、 Classで各フィールドを定義して、各フィールドの値を ByteBufferでByte配列に配置して、RandomAccessFileでこの配列の内容を書き込んだり、この逆の方法で 読み出したりしています。  この方法だと、各フィールドをわざわざ一つ一つByte配列に 配置しなければならず、面倒です。  他の言語の構造体やレコードの概念の様にフィールドの塊を 一気にランダムファイルに簡単に読み書きする方法は有りませんでしょうか?  ご存知の方がいらっしゃいましたら、ご教示の程、是非よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのソートについて。

    うまく文章で伝えられないかもしれませんがお願いします。 csvファイルの中に 名前、住所、電話番号、アドレス と入った一文が複数あるとします。 これを名前の50音順に並べたいのですが、 文字でもArrays.sortでソートは可能でしょうか? 一応やってみたのですがうまくいきませんでした。 さらに質問なんですが私はこのcsvファイルの一文を削除したり、変更したりというプログラムを作っています。 変更や削除の場合は一度配列に全ての文を入れてその後削除、変更を行った後に またファイルに書き込むという形をとっています。 この場合50音順に並べるには一度書き込みが終った後もう一度読み込んでソートをして 書き込みなおすしか方法はないのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java