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

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

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

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

Q&A

解決済

2回答

1506閲覧

java インターフェース 比較

junnnnchan

総合スコア26

Java

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

0グッド

0クリップ

投稿2020/06/04 02:44

編集2020/06/04 06:11
public class Student implements Comparable { //implements -> Comparableインターフェース継承 private int id; // 学籍番号 private String name; // 氏名 private int grade; // 学年 public Student(int id, int grade, String name) { this.id = id; this.grade = grade; this.name = name; } public String toString() { return id + "," + grade + "," + name; } @Override public int compareTo(Object o) { //object抽象的、曖昧 Student st = (Student) o; // TODO: // thisとstを比較し... // 1.thisの方が学年が下ならば、負の整数(例えば-1)を返す。 if(this.grade < st.grade ) return -1; // 2.thisの方が学年が上ならば、正の整数(例えば1)を返す。 if(this.grade < st.grade ) return 1; // 3.学年が同じでthisの方が学籍番号の数値が小さければ、負の整数を返す。 if(this.grade == st.grade && this.id < st.id) return -2; // 4.学年が同じでthisの方が学籍番号の数値が大きければ、正の整数を返す。 if(this.grade == st.grade && this.id > st.id) return 2; // 5.それ以外なら 0 を返す。 return 0; } }
import java.util.Arrays; public class StudentList { public static void main(String[] args) { // 学生データを準備 Student[] list = new Student[] { // 2年生 new Student(10190003, 2, "Alice"), new Student(10190004, 2, "Bob"), // 1年生 new Student(10200001, 1, "Carol"), new Student(10200002, 1, "Dave"), // 5年生 new Student(21200005, 5, "Eve"), new Student(21200006, 5, "Frank") }; // list配列の添え字0以上6未満の範囲を並び替える Arrays.sort(list, 0, 6); // 並び替えた結果を順に出力する for (int i = 0; i < list.length; i++) { System.out.println(list[i]); } } }

student配列を学年の低い学生から学年の高い学生に、同じ学年であれば学籍番号の数値の小さい学生から大きい学生に、並ぶようにしたいです。

エラー文
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to comptest.Student
at comptest.Student.compareTo(Student.java:29)
at comptest.Student.<init>(Student.java:19)
at comptest.StudentList.main(StudentList.java:15)

実行結果をこうしたい

10200001,1,Carol
10200002,1,Dave
10190003,2,Alice
10190004,2,Bob
21200005,5,Eve
21200006,5,Frank

public String toString()を使うと思うのですが、どこで使うのかもわかりません。
どういうプロセスで書けばよいのでしょうか。

Comparableはあとで追加します。
Comparable対応にする際に必要となるcompareToメソッドを記述しています

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

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

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

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

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

ozwk

2020/06/04 03:01 編集

Studentクラスのコンストラクタ中にあるcompareTo()2つは一体なにを意図して書いたんですか?
ozwk

2020/06/04 06:29

コード書き換えたっぽいですけどまだ問題起きてます?
junnnnchan

2020/06/04 06:42

正常に動くのですが、エラーが消えません。。 エラー文 Testsuite: comptest.AllTests Tests run: 4, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec Testcase: testStudentList took 0.001 sec Testcase: testSort took 0.008 sec Testcase: testCompareTo took 0.002 sec FAILED 1491391,3,aykbを引数に1924546,6,artbmwのcompareToを呼んだとき、compareToの結果が正でない junit.framework.AssertionFailedError: 1491391,3,aykbを引数に1924546,6,artbmwのcompareToを呼んだとき、compareToの結果が正でない at comptest.StudentTest.testCompareTo(StudentTest.java:247) Testcase: testStudent took 0.001 sec
junnnnchan

2020/06/04 06:45

符号間違えてました。。
guest

回答2

0

そもそも、ジェネリクスの入らないComparableを使うのが適当ではありません。

まずは、implements Comparable<Student>としてみましょう。すると、不適当な型で比較しようとしている箇所がコンパイルエラーになってくれます

投稿2020/06/04 02:59

maisumakun

総合スコア146018

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

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

0

ベストアンサー

とりあえず

diff

1public class Student implements Comparable { //implements -> Comparableインターフェース継承 2 private int id; // 学籍番号 3 private String name; // 氏名 4 private int grade; // 学年 5 6 public Student(int id, int grade, String name) { 7 this.id = id; 8 this.grade = grade; 9 this.name = name; 10- compareTo(id); // <--------------- いらない 11- compareTo(grade); // <--------------- いらない 12 } 13 14 public String toString() { 15 return id + "," + grade + "," + name; 16 } 17 18 @Override 19 public int compareTo(Object o) { //object抽象的、曖昧 20 Student st = (Student) o; 21 22 // TODO: 23 // thisとstを比較し... 24- this.compareTo(st); // <--------------- いらない 25 26 // 1.thisの方が学年が下ならば、負の整数(例えば-1)を返す。 27 if(this.grade < st.grade ) return -1; 28 // 2.thisの方が学年が上ならば、正の整数(例えば1)を返す。 29 if(this.grade < st.grade ) return 1; 30 // 3.学年が同じでthisの方が学籍番号の数値が小さければ、負の整数を返す。 31 if(this.grade == st.grade && this.id < st.id) return -2; 32 // 4.学年が同じでthisの方が学籍番号の数値が大きければ、正の整数を返す。 33 if(this.grade == st.grade && this.id > st.id) return 2; 34 // 5.それ以外なら 0 を返す。 35 return 0; 36 } 37 38}

投稿2020/06/04 05:28

編集2020/06/04 06:15
ozwk

総合スコア13553

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

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

gentaro

2020/06/04 06:13

「いらない」というコメント書くぐらいなら ```diff ``` で差分提示した方が良いような。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問