7

我有两个类 Person 和 Employee 的对象。两个类都有共同的属性年龄。而且我已经将这两个类的几个对象添加到 Arraylist 中,现在我想要两个写一个 Comparator 并将其传递给 Collections 类的 sort 方法。并希望根据年龄对列表进行排序。我尝试这样做只是为了更清楚地了解 Java 中 Comparable 和 Comparator 的使用。

编辑:我问这个问题的原因是我不清楚 Comparator 和 Comparable。我在某处读到如果 Class 实现 Comparable 那么它不能与其他类的对象进行比较(因为 Class cast 异常)。

现在,如果我在 Employee 和 Person 中创建关系,则无需实现 Comparator(除非我想根据这些类的名称或其他公共属性进行排序)。

再一次,我问了这个问题是为了更清楚地了解 Comparator 和 Comparable。

到目前为止,我能够理解的是,如果我想对多个参数进行排序,那么我应该实现 Comparator 并将其传递给 Collections.srot()。

或者,如果我无法控制正在排序的对象的类,那么我应该实现比较器的自定义排序。(如果我错了或者我遗漏了什么,请纠正我)

编辑

我想现在我理解了 Comparable 和 Comparator 的使用。为了确保我得到正确的概念,我的理解是:如果我想比较不同类的两个对象(并且没有关系),那么我应该使用原始比较器并覆盖比较方法。有人会实施 Comparator 而不是 Comparable 的另一个原因是在排序方面具有灵活性。而我从自然排序中所理解的,是 Class 在 CompareTo 方法中实现的逻辑。

希望我对所有这些观点都是正确的。

4

3 回答 3

6

您可以定义一个名为 Ageable 的接口,Employee 和 Person 可以实现该接口。您也可以定义一个具有相同效果的抽象类(Employee 和 Person 将从抽象类继承)。请注意,出于这个原因,您也可以使用普通类,您可以做任何您需要的事情。

此外,如果没有理由说 Employee 不是 Person(例如机器人在办公室工作),那么 Employee 可以从 Person 继承。

于 2012-09-13T20:35:10.657 回答
4

我会让 Employee 成为 Person 的子类。(假设你所有的员工都是人)那么你可以创建一个Comparator<Person>

于 2012-09-13T20:34:59.647 回答
3

您应该创建一个接口AgeProvider

public interface AgeProvider {
    int getAge();
}

两者都Person应该Employee实施AgeProvider。现在您可以实现一个比较 2 的 Comparator AgeProvider

于 2012-09-13T20:34:13.320 回答