【问题标题】:adding comparable interface and adding a compareTo() method添加可比较的接口并添加 compareTo() 方法
【发布时间】:2020-04-14 11:15:27
【问题描述】:

我在添加上面提到的两个时遇到了一些麻烦。我有两节课。员工和公司。

员工类包含一些关于员工的信息、实例变量,包括他们的姓名、日期、numOfSales 等。还有一些方法,如 setName、getName 等。

Company 类创建一个空列表。然后它有一个从文本文件中读取员工列表的方法——这就是列表被填充的方式。

我需要做的是:按他们的 numOfSales 对列表进行排序。我首先需要修改员工类,使其实现 Comparable 接口。

public class Employee implements Comparable<Company>

我不确定公司或员工是否应该去那里^ ?但是当我尝试任何一个时,我都会收到错误消息“Employee 不是抽象的,并且不会覆盖 java.lang.Comparable 中的抽象方法 CompareTo”我在这里做错了什么?我不能更改任何类,不能将它们更改为 abstract 或任何东西,我不能添加任何新的。

然后我需要写一个 compareTo() 方法,我把它放在员工类中?这将允许员工按其 numOfSales 实例变量存储的值的升序排序。

【问题讨论】:

  • 应该是public class Employee implements Comparable&lt;Employee&gt;,你应该实现public int compareTo(Employee other)
  • @Eran 我也试过了,它仍然给出相同的错误消息,说 Employee 不是抽象的。可能是因为我没有写我的比较方法? compareTo() 方法是在构造函数和实例变量之前还是之后写的?
  • @Nicole 没关系,这是风格问题。但是,通常首先声明实例变量,然后是构造函数,然后是方法。

标签: java comparable


【解决方案1】:

如果您有某种List&lt;Employee&gt;,您可以使用静态方法Collections.sort() 对其进行排序,而无需在Employee 类上实现Comparable 接口。您可以简单地使用接受 Comparator 对象的 sort 函数的变体,该对象将用于比较 Employee 类的两个实例。

而且您甚至不需要自己实现一个。您可以简单地使用Comparator.comparingInt​(e -&gt; e.numOfSales) 创建正确的Comparator 来对您的列表进行排序。

所以

Collections.sort(employees, Comparator.comparingInt​(e -> e.numOfSales));

足以对您的员工列表进行排序。

【讨论】:

    【解决方案2】:

    Employee 应该与其他Employees 相当,所以它是Comparable&lt;Employee&gt;。然后您需要实现compareTo 方法,如错误消息所述:

    public class Employee implements Comparable<Employee> {
        private int numOfSales;
        // other data members
    
        // Constructors, getters, setters, etc
    
        @Override
        public int compareTo(Employee e) {
            return Integer.compare(numOfSales, e.numOfSales);
        }
    }
    

    【讨论】:

    • 啊,所以这解释了消息......你将如何测试该方法?
    • @Nicole 创建一些 Employee 实例,它们具有不同的 numOfSales 值,并检查 compareTo 在您调用它们时返回的内容。
    • 抱歉忘记加标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多