2016-09-01 5 views
-8

Collection<BasePerson>があります。BasePersonは共通プロパティを共有するabstractクラスです。抽象コレクションを実装クラスでどのようにソートするか?

abstract class BasePerson { 
    String name; 
} 

class Person extends BasePerson { 

} 

class Employee extends BasePerson { 
    int id; 
} 

種類によってコレクションを並べ替えることはできますか?私はいずれかPersonnameと "非人"のクラスの上にソートする必要があります。どのように私は、このようなComparator<Person>を作成することができます

xava (persons before employees) 
tom,30 (id should have a higher weight than name comparison) 
anna,31 

#name;id 
xava (Person) 
anna,31 (Employee) 
tom,30 (Employee) 

出力:

Employeeは、その人自身がidで最初にソートする必要があり、その後name

入力によるオブジェクト?

new Comparator<BasePerson>() { 
    @Override 
    public int compare(BasePerson p1, BasePerson p2) { 
     if (p1 instanceof Person) { 
      if (p2 instanceof Person) { 
       return p1.getName().compareTo(p2.getName());  
      } 

      return 1; 
     } else if (p2 instanceof Person) { 
      return -1; 
     } 

     return 0; 
    } 
} 
+7

何か試しましたか? –

+0

はい、インスタンスに基づく比較部品をコンパレータに追加する方法はわかりません。 – membersound

+3

あなたが試したことを表示 – Jens

答えて

2

数字で考えると、コンパレータのアルゴリズムは簡単です。例えば :Integer.compare(n,m)int n = 1int m = 2デフォルト動作(n < m) ? -1 : ((n == m) ? 0 : 1)を行うと-1nため(最初のパラメータ)を返すはm(第2パラメータ)よりも低いです。したがって、最初のパラメータが2番目のパラメータよりも小さい場合、コンパレータは負の整数値を返す必要があります。

n = 3m = 0場合、それは1mため(第2パラメータ)を返しn(最初のパラメータ)よりも低いです。第1のパラメータが第2のパラメータよりも大きい場合、コンパレータは正の整数値を返すべきである。

n = 1m = 1の場合、どちらも等しいため、0を返します。

次の2つのミスがあります

new Comparator<BasePerson>() { 
     @Override 
     public int compare(BasePerson p1, BasePerson p2) { 
      if (p1 instanceof Person) { 
       if (p2 instanceof Person) { 
        return p1.getName().compareTo(p2.getName()); 
       } 
       return -1; // <--------------------------------- here is mistake-1 
      } else if (p2 instanceof Person) { 
       return 1; // <---------------------------------- here is mistake-2 
      } 
      // Employee comparator: 
      if (p1 instanceof Employee && p2 instanceof Employee) { 
       Employee e1 = (Employee) p1; 
       Employee e2 = (Employee) p2; 
       if (e1.id == e2.id) { 
        return p1.getName().compareTo(p2.getName()); 
       } else { 
        return Integer.compare(e1.id, e2.id); 
       } 
      } 
      return 0; 
     } 
    }; 

間違い-1:(p1人のインスタンスであり、p2ではない)のでp1が、p2より低い場合は、1を返され、それは正の整数です! p2p1より低いと言っています。

間違い-2:(p1人のインスタンスではなく、p2がそれをある)のでp1が、p2以上であるあなたが-1を返され、それが負の整数であれば! p1p2より低いと言っています。

EDIT:

私は、従業員のコンパレータを追加しました。

+0

最後の 'return 0'は' return p1.getName()。compareTo(p2.getName()); ')です。 – Onheiron

+1

@Onheironそうではありませんが、従業員を比較する基準は異なります。これのために編集されました。 –

+0

私が理解していないこと: 'p1 = Person'と' p2!= Person'の場合、 'p1、p2'を注文したいと思います。なぜ私は '+ 1'ではなく '-1'を返すべきですか? – membersound

関連する問題