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

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

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

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

Q&A

解決済

1回答

2382閲覧

Collection.sortについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2017/10/03 16:07

Carクラスのインスタンスを、plateまたはyearの昇順によって並べ替えたいのですが、上手くいきません。コンパイルエラーは起きていないのですが、何が原因でしょうか?よろしくお願いします。

Java

1public class Car{ 2 3 ArrayList<Car> list; 4 String plate, brand; 5 int year; 6 7 8 Car(){ 9 list = new ArrayList<Car>(); 10 plate = null; 11 brand = null; 12 year = 0; 13 } 14 15 Car(String sp, String sp2, int sp3){ 16 this.plate = sp; 17 this.brand = sp2; 18 this.year = sp3; 19 } 20 21 public void add(String[] sp) { 22 int year = Integer.parseInt(sp[3]); 23 list.add(new Car(sp[1], sp[2], year)); 24 } 25 26 27 public void list() { 28 for(int i = 0; i < list.size(); i++) { 29 System.out.println(list.get(i)); 30 } 31 } 32 33 public void listPlate() { 34 Collections.sort(list, new PlateComparator()); 35 for(int i = 0; i < list.size(); i++) { 36 System.out.println(list.get(i)); 37 } 38 } 39 40 41    public void listYear() { 42 Collections.sort(list, new YearComparator()); 43 for(int i = 0; i < list.size(); i++) { 44 System.out.println(list.get(i)); 45 } 46 } 47 48 public String toString() { 49 return this.plate + " " + this.brand + " " + this.year; 50 } 51} 52 53public class PlateComparator implements Comparator<Car> { 54 55 @Override 56 public int compare(Car a, Car b) { 57 return a.plate.compareTo(b.plate); 58 } 59} 60 61public class YearComparator implements Comparator<Car>{ 62 63 @Override 64 public int compare(Car a, Car b) { 65 return a.year - b.year; 66 } 67} 68 69public class Main { 70 public static void main(String[] args) throws IOException { 71 72 Car c = new Car(); 73 74 while(true) { 75 76 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 77 String s = br.readLine(); 78 79 String[] sp = s.split(" "); 80 81 if(sp[0].equals("add")) 82 c.add(sp); 83 84 else if(sp[0].equals("list")) 85 c.list(); 86 87 else if(sp[0].equals("list") && sp[1].equals("plate")) 88 c.listPlate(); 89            90         else if(sp[0].equals("list") && sp[1].equals("year")) 91 c.listYear(); 92 93 94         else 95 System.out.println("無効なコマンドです。"); 96 97 } 98 } 99} 100 101

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

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

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

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

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

guest

回答1

0

ベストアンサー

いくつか修正が必要な箇所がありそうですが、大きく2箇所が問題となっているようです。

  1. System.inストリームを読み込むBufferedReaderを入力ごとに新規作成していますが、作成はループ前に1度だけ行うようにする。
  2. スペースで分割した1つめの文字列が"list"であればリスト表示を行いますが、"list plate"等を実行しようとしても"list"が優先されるため並び替え処理に到達しません。

他に、下記についても確認されるとよいかと思います。

  • インデントが適切でない
  • CarクラスがCarのリストを持っているのは不思議
  • listPlate()やlistYear()でリスト表示する際はlist()を呼べばよいのでは?
  • yearが数字で入力されなかった場合の考慮が必要
  • if文は1文であってもブロックとする({}を省略しない)

投稿2017/10/03 16:57

編集2017/10/03 17:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/10/03 17:37 編集

回答ありがとうごいます。ご指摘されたところを修正したところ(最初の"list"のif文を消してみたところ)、並び替えることができました。 ただ、普通の並べ替えなしのリスト表示と、並べ替えた場合のリスト表示の両方の選択肢を選べるようにしたいのですが、可能でしょうか? 最初に"list"(並べ替えなしのリスト表示)を書くと、それにひっかかるので、"list plate", "list brand", "list year"の次に "list"の条件文を書いてみたのですが、この時に"list"のみを入力すると java.lang.ArrayIndexOutOfBoundsException エラーが生じてしまいます。
退会済みユーザー

退会済みユーザー

2017/10/03 17:37

sp[0]には常に何らかの値が入力されていることは前提としてもよいと思いますが、 sp[1]が参照可能かどうかは、事前に配列のサイズを確認する必要があります。 sp[1]が参照可能であればsp[1]を含んだコマンドの確認、そうでなければリスト表示としてはどうでしょうか。
退会済みユーザー

退会済みユーザー

2017/10/03 18:04 編集

事前に配列のサイズもチェックするようにしたところ、うまくいきました。ありがとうございました。
swordone

2017/10/03 18:56

splitしなければいいのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問