【问题标题】:Can Comparator compare two objects of different type?Comparator 可以比较两个不同类型的对象吗?
【发布时间】:2012-09-07 00:21:17
【问题描述】:

我有两个对象,分别是 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 方法中实现的逻辑。

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

【问题讨论】:

  • 你为什么不使用接口(例如 Ageable)让 Person 和 Employee 都实现它并比较两个 ageable 对象?
  • @om-nom-nom 这听起来像是对这个问题的一个很好的回答。
  • 如果你不使用泛型,当然可以。
  • 我假设 Employee 扩展了 Person,不是吗?
  • 是的,使用反射并将性能扔到窗口*讽刺*

标签: java comparator


【解决方案1】:

你应该创建一个接口AgeProvider:

public interface AgeProvider {
    int getAge();
}

PersonEmployee 都应该实现 AgeProvider。现在您可以实现比较 2 个 AgeProvider 的 Comparator。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我最好定义一个 Ageable 接口(正如其他用户所说)。子类化可能会产生不必要的副作用
    • @polypiel 就像在您无意中将员工视为个人一样;)
    【解决方案3】:

    您可以定义一个名为 Ageable 的接口,Employee 和 Person 可以实现该接口。您也可以定义一个具有相同效果的抽象类(Employee 和 Person 将从抽象类继承)。请注意,您也可以因此使用普通类,您可以为所欲为。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多