私は(「プログラム」と「教員」による「教授」のオブジェクトによって「スチューデントオブジェクト)特定のatributeによってオブジェクトの二つの異なるのArrayListのソートしようとしています。どちらのクラスには、私の抽象的な「人のクラスを拡張します。
public abstract class Person implements Comparable<Person>{
private String name;
private String adress;
//getters, setters, etc., all works properly
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public int compareTo(String string) {
return name.compareTo(string);
}
}
私は学生や教授することができより1000000ランダムな「人」オブジェクトの配列を作成するときに、私は(正常に動作)このような彼らの名前のアルファベット順でソートすることを決定しました。
Person personByName[] = arrayPersonas.clone();
Arrays.sort(personByName);
その後、私は2つのArrayList、オブジェクトおよび教授のための別のオブジェクトの学生のための1つに本人アレイを分割します:
ArrayList<Student> studentsByProgram = new ArrayList();
ArrayList<Professor> professorsByFaculty = new ArrayList();
for (int i = 0; i < 1000000; i++) {
if (arrayPersonas[i] instanceof Student) {
studentsByProgram.add((Student)arrayPersonas[i]);
} else {
professorsByFaculty.add((Professor)arrayPersonas[i]);
}
}
それは人の名前によってそれらをソートし続けるので、私は、私が欲しいatributeのアルファベット順に各ArrayListのを並べ替えるしようとすると、問題が来ます:
Collections.sort(studentsByProgram);
Collections.sort(professorsByFaculty);
ここで私は私の学生と教授のクラスを残します:
public class Student extends Person {
private String program;
private int year;
private double fee;
//constructor, setters, getters, toString, equals
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public int compareTo(String string) {
return program.compareTo(string);
}
@Override
public int compareTo(Person t) {
return super.compareTo(t.getName());
}
}
教授クラス:
public class Professor extends Person {
private String faculty;
private double salary;
//constructor, setters, getters, toString, equals
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public int compareTo(String string) {
return faculty.compareTo(string);
}
@Override
public int compareTo(Person t) {
return super.compareTo(t.getName());
}
}
何が私が間違っているのでしょうか?私はそれが「プログラム」atributeを使用して、私の学生のクラスから「のcompareTo()」メソッドを使用するオブジェクト学生のArrayListの上で「Collections.sortを()」を呼び出す場合、私は思いました。私は届かないものがあるので、私はまだ、これらの方法で動作するように学んでいます。
問題点
- あなたはどのように定義していない
Person
オブジェクトを比較すべきです。 - あなたは間違ってどのように定義
Student
してProfessor
比較すべきであるインスタンス。 - あなたはオーバーロードされたメソッド書いて
compareTo(String)
誤解されています。
ソリューション
定義し
Person#compareTo
、その削除適切にcompareTo(String)
:public int compareTo(Person p) { return getName().compareTo(p.getName()); }
定義
Student#compareTo
とProfessor#compareTo
正しく、自分のを削除compareTo(String)
。ここでは方法の例ですStudent#compareTo
書くことができは:@Override public int compareTo(Person t) { final int personComparisonResult = super.compareTo(t); if (personComparisonResult == 0) { return program.compareTo(((Student) t).program); } return personComparisonResult; }
それは「としてそれらを比較すると言い
Person
、彼らは(ここでは、同じ名前を持つ)等しい場合、として、それらを比較する第1のSStudent
(学生のプログラムで、ここでは)S」。私はこれらのメソッドを削除します。これは、クラスのドメインに適合しないコードのシンプルなラインのための別の方法を持つ価値はありません。