2016-09-01 83 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

相关问题