JavaのCollections.sort()期待通りに並べ替えていません

マルク・ブラウアー:

私は(「プログラム」と「教員」による「教授」のオブジェクトによって「スチューデントオブジェクト)特定の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を()」を呼び出す場合、私は思いました。私は届かないものがあるので、私はまだ、これらの方法で動作するように学んでいます。

アンドリューTobilko:

問題点

  1. あなたはどのように定義していないPersonオブジェクトを比較すべきです。
  2. あなたは間違ってどのように定義StudentしてProfessor比較すべきであるインスタンス。
  3. あなたはオーバーロードされたメソッド書いてcompareTo(String)誤解されています。

ソリューション

  1. 定義しPerson#compareTo、その削除適切にcompareTo(String)

    public int compareTo(Person p) {
        return getName().compareTo(p.getName());
    }
    
  2. 定義Student#compareToProfessor#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のS Student(学生のプログラムで、ここでは)S」。

  3. 私はこれらのメソッドを削除します。これは、クラスのドメインに適合しないコードのシンプルなラインのための別の方法を持つ価値はありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173856&siteId=1