我有一个Collection<BasePerson>
,其中BasePerson是一个共享公共属性的abstract
类。
abstract class BasePerson {
String name;
}
class Person extends BasePerson {
}
class Employee extends BasePerson {
int id;
}
如何按类型对集合进行排序?我想让任何Person
按name
排序,并在任何&#34;非人物#34;之上排序。类。
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;
}
}
答案 0 :(得分:2)
如果您考虑数字,比较器算法可以很容易。
例如:int n = 1
和int m = 2
Integer.compare(n,m)
的默认行为
执行(n < m) ? -1 : ((n == m) ? 0 : 1)
并返回-1
,因为n
(第一个参数)低于m
(第二个参数)。因此,当第一个参数低于第二个参数时,比较器应该返回一个负整数值。
如果n = 3
和m = 0
,则返回1
,因为m
(第二个参数)低于n
(第一个参数)。当第一个参数大于第二个参数时,比较器应该返回一个正整数值。
如果n = 1
和m = 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:如果p1
低于p2
,因为(p1
是人的实例且p2
不是),您返回了1
这是一个正整数!您说p2
低于p1
。
错误-2:如果p1
大于p2
,因为(p1
不是人的实例且p2
是它),您返回{{1}这是一个负整数!您说-1
低于p1
。
编辑:
我添加了员工比较器。