2016-09-01 113 views
-8

我有一個Collection<BasePerson>,其中BasePerson是abstract類共享公共屬性。如何通過實現類對抽象集合進行排序?

abstract class BasePerson { 
    String name; 
} 

class Person extends BasePerson { 

} 

class Employee extends BasePerson { 
    int id; 
} 

如何按類型對集合進行排序?我想要任何Person排序name和任何「非人」類之上。

Employee對象自理應由id先進行排序,然後通過name

輸入:

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

輸出:

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

如何創建這樣一個Comparator<Person>

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

比較算法可以很容易,如果你認爲在數字。 例如:int n = 1int m = 2Integer.compare(n,m) 默認行爲做(n < m) ? -1 : ((n == m) ? 0 : 1)並返回-1因爲n(第一參數)低於m(第二個參數)。所以,當第一個參數低於第二個參數時,比較器應該返回一個負整數值。

如果n = 3m = 0,它返回1因爲m(第二參數)低於n(第一個參數)。當第一個參數大於第二個參數時,比較器應該返回一個正整數值。

如果n = 1m = 1,它返回0,因爲兩者都是等於。

你有兩個錯誤:

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:如果p1p2低,因爲(p1是人的一個實例,並p2是不是),你回來1,這是一個正整數!您在說p2低於p1

誤區2:如果p1p2更大,因爲(p1不是人的實例,p2是它),你回來-1,這是一個負整數!您在說p1低於p2

編輯:

我增加了員工比較。

+0

也是最後的'return 0'應該是'return p1.getName()。compareTo(p2.getName());' – Onheiron

+1

@Onheiron它不是,員工的比較標準不同。爲此編輯。 –

+0

我不明白:如果'p1 = Person'和'p2!= Person',我想要命令'p1,p2'。那麼爲什麼我應該返回一個'-1',而不是'+ 1'? – membersound

相關問題