【问题标题】:Java using ComparatorJava 使用比较器
【发布时间】:2014-07-16 12:56:42
【问题描述】:

我在我的 Employee 类中实现 Comparator 和 Comparable 来对数组列表进行排序。我正在对 2 个参数名称和 ID 进行排序。使用 Collections.sort(Employee ob1, Employee ob2) 对 ID 进行排序时,它不起作用。我收到编译错误,即该类未声明为抽象并且我没有覆盖 compare(),尽管我这样做是:

public int compare(Employee ob1, Employee ob2)
{
return ob1.id-ob2.id;
}

如果我使用它会很好用

public int compare(Object ob1, Object ob2)
{
return ((Employee)ob1).id-((Employee)ob2).id;
}

我的疑问是为什么前面的那个不起作用,因为 Employee 也是一个对象。 compareTo(Object ob) 也存在同样的问题,虽然覆盖了为什么我不能直接使用 Employee 以及为什么我需要在那里使用 Object 并且稍后需要将其转换为 Employee 类。

【问题讨论】:

  • 你是如何声明你的比较器的?作为ComparatorComparator<Employee>
  • @tobias_k 显然是Comparator
  • 是的,现在知道了,谢谢

标签: java comparator comparable


【解决方案1】:

多态,使用 Object,Object 覆盖 Comparator 中的原始类型。使用您的类名与该签名不匹配。对于混淆签名时的编译错误,请使用模板类型。

public class Employee implements Comparator<Employee> {
  // ....
  @Override
  public int compare(Employee ob1, Employee ob2) {
    return ob1.id-ob2.id;
  }
}

【讨论】:

    【解决方案2】:

    您需要实现接口定义的确切方法。 如果您想直接使用您的对象,请使用 通用语法:

    public class Employee implements Comparator<Employee> 
    {
       @Override
       public int compare(Employee ob1, Employee ob2) 
       {
          return ob1.id - ob2.id;
       }
    
    }
    

    确保使用@Override Annotation。如果你弄错了方法(参数、返回值等),这会给你一个编译器警告

    当使用Comparable时,你可以这样使用:

    public class Employee implements Comparable<Employee> 
    {
       @Override
       public int compareTo(Employee e) 
       {
          //your compare code
       }
    }
    

    另见:Comparable vs Comparator

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2018-11-27
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多