2017-07-02 5 views
0

私は宿題をしながら小さな問題を思いついた。サブクラスでComparableインターフェイスを実装すると、Collections.sort()をどのように使用できますか?

私はPersonクラスに

public class Person { 
    protected String code; 
    protected String name; 
} 

そして、先生は私たちが後のArrayList

public class Professor { 
    private List<Person> arr; 

    public Professor() { 
     arr = new ArrayList(); 
    } 
} 

を使用して学生を管理するために、教授クラスを作成したい学生

public class Student extends Person implements Comparable<Student>{ 

    private double grade; 

    @Override 
    public int compareTo(Student that){ 
     return Double.compare(grade, that.grade); 
    } 
} 

と呼ばれるサブクラスを持っています約10人の学生をArrayListに追加し、そのリストをソートするように求められます。問題は、私が知っている限り、リスト< Person>、List < Student>を宣言して以来、私はCollections.sort(arr)を使用できません。

私は何かを誤解しましたか?この状況でCollections.sort()を使用する方法はありますか、手動でソートするメソッドを作成する必要がありますか?

は、彼はまた、代わりに

EDIT>リスト<学生の>リスト<人を作成するために私たちを尋ね、クラスの学生で、Comparableインタフェースを実装するために私達に尋ねた:ありがとうございました。すべての回答とコメントを承認してください。上記の問題は<学生の一覧を表示するためにダウンキャスト一覧<人>することによって解決されている>

+0

を使用してリストをソートするためにあなたに別のアプローチを提供していますですコンパイラは間違いなくそのクラスに属しています。 –

+1

あなたのクラス 'Person'はおそらく* abstract *クラスです。それで 'Comparable'を実装する' Person'を宣言できますが、 'Person'のサブクラスで'Comparable'を実装する実際のコードは –

+0

のみです.Timothy Truckle私はあなたに同意します。これらの要件では、最も論理的な方法と思われます。 – davidxxx

答えて

2

先生は私たちがArrayListの

を使用して学生 を管理するために、教授クラスを作成したいので

private List<Person> arr; 
を置き換えます

by

private List<Student> students; 
このようにして

は、Collections.sort(students)studentとしてListComparableの要素(StudentComparableインタフェースを実装する)を意味する呼び出すことができ。コメント後


編集:

要件は非常に論理的ではありません:あなたは何か(List<Person>)をソートする必要があり(ComparableのみStudent道具など)ソート可能ではありません。論文の条件で

は、次の3つの方法があります。

  • 最も簡単かつクリーンな方法(あなたがそれを使用する可能性がある場合)。
    Personをを実装していますが、抽象的に維持するクラスのabstractにしてください。
    この方法では、キャストを使用する必要はありません。あなたは直接List<Student>List<Person>からダウンキャストList<Person>

  • 力で Collections.sort()を起動してからCollections.sort() を呼び出すことができます。

  • は自分で並べ替えを行うが、あなたはまだあなたがPersonとしてStudentクラスのcompareTo()メソッドを使用したい場合は、いくつかのキャストを行うComparableインスタンスではありません必要があります。

+0

あなたの答えをありがとう。事は彼がリスト< Person >を使用するように強制しています。それは本当にクラス全体を悩ます。 –

+0

あなたは大歓迎です。要件は本当に論理的ではありません。私は3つの命題を更新しました。 – davidxxx

+0

@davidxxx非常にありがたいです。ダウンキャストオプションでうまく動作します。 –

0

コレクションがソートAPIがあるとしてimplements Comparable<Person>実装するために必要なので、それは人として許可されていません。ポストの下に述べたように

public static <T extends Comparable<? super T>> void sort(List<T> list) { 
     list.sort(null); 
    } 

一つの方法は、あなたが学生をソートする予定がある場合、私はComparator

class SortbyGrade implements Comparator<Student> 
{ 
    // Used for sorting in ascending order of 
    // roll number 
    public int compare(Student a, Student b) 
    { 
     return Double.compare(a.grade, b.grade); 
    } 
} 

//コレクションのソート

Collections.sort(arr, new SortbyGrade()); 
関連する問題