如何通过实现类对抽象集合进行排序?

时间:2016-09-01 13:43:17

标签: java sorting

我有一个Collection<BasePerson>,其中BasePerson是一个共享公共属性的abstract类。

abstract class BasePerson {
    String name;
}

class Person extends BasePerson {

}

class Employee extends BasePerson {
    int id;
}

如何按类型对集合进行排序?我想让任何Personname排序,并在任何&#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;
    }
}

1 个答案:

答案 0 :(得分:2)

如果您考虑数字,比较器算法可以很容易。 例如:int n = 1int m = 2 Integer.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:如果p1低于p2,因为(p1是人的实例且p2不是),您返回了1这是一个正整数!您说p2低于p1

错误-2:如果p1大于p2,因为(p1不是人的实例且p2是它),您返回{{1}这是一个负整数!您说-1低于p1

编辑:

我添加了员工比较器。