【问题标题】:How to sort an abstract collection by the implementation classes?如何按实现类对抽象集合进行排序?
【发布时间】:2017-01-09 10:29:08
【问题描述】:

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

abstract class BasePerson {
    String name;
}

class Person extends BasePerson {

}

class Employee extends BasePerson {
    int id;
}

如何按类型对集合进行排序?我想让 Any Personname 排序,并放在任何“非人”类之上。

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;
    }
}

【问题讨论】:

  • 你有什么尝试吗?
  • 展示你的尝试
  • 您是否尝试过使用instanceofoperator? (结合类型转换)
  • "weka""tom" 怎么可能是int name 类型的属性?
  • 这是测试驱动开发 (tdd) 的一项好任务。用你能想到的所有可能的组合来编写你的测试。请记住 Comparator 的规则:docs.oracle.com/javase/7/docs/api/java/util/Comparator.html。然后开始实施 Comparator。

标签: java sorting


【解决方案1】:

如果您考虑数字,比较器算法会很简单。 例如:int n = 1int m = 2 Integer.compare(n,m) 的默认行为 执行(n &lt; 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;
        }
    };

错误一:如果p1小于p2,因为(p1是person的实例而p2不是)你返回了1并且它是一个正整数!你是说p2低于p1

错误2:如果p1大于p2,因为(p1不是person的实例,p2是)你返回了-1,它是一个负整数!你是说p1 低于p2

编辑:

我添加了员工比较器。

【讨论】:

  • 最后的return 0也应该是return p1.getName().compareTo(p2.getName());
  • @Onheiron 不是,比较员工的标准不同。为此编辑。
  • 我不明白的是:如果p1=Personp2 != Person,我想订购p1, p2。那我为什么要返回-1,而不是+1
  • 因为如果返回-1你是说第一个参数低于第二个,而且排序是升序。然后p1 将在p2 之前
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2017-11-20
  • 2020-03-19
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多