0

我正在阅读文章Java Sorting: Comparator vs Comparable Tutorial,并且对此有一些疑问。

List<Employee> col = new ArrayList<Employee>();

col.add(new Employee(5, "Frank", 28));
col.add(new Employee(1, "Jorge", 19));
col.add(new Employee(6, "Bill", 34));
col.add(new Employee(3, "Michel", 10));
col.add(new Employee(7, "Simpson", 8));
col.add(new Employee(4, "Clerk", 16));
col.add(new Employee(8, "Lee", 40));
col.add(new Employee(2, "Mark", 30));

return col;
  1. 这是一个 Employee 对象的 ArrayList。我可以在这个员工对象中添加多少项?我可以做这样的事情吗?

    col.add(new Employee(5, "Frank", 28, "asas", "asas"));
    

    这基本上是一个Array[0]包含所有这些对象的数组。我实际上是在尝试通过ArrayList.

  2. 为什么是printList静态的?我这里也可以有其他类型吗?

     private static void printList(List<Employee> list) {
         System.out.println("EmpId\tName\tAge");
         for (Employee e: list) {
             System.out.println(e.getEmpId() + "\t" + e.getName() + "\t" + e.getAge());
         }
     }
    
  3. 比较时,this代表和o代表什么?

    public int compareTo(Employee o) {
         return this.empId - o.empId;
    }
    

    这里是什么this意思?

4

6 回答 6

2

约翰,

  1. col.add 只接受一个 Bject。因此,您使用新操作创建一个 Employee 对象并将其添加到列表中。所以,你不能使用这个 - new Employee(5, "Frank", 28, "asas", "asas"),因为 Employee 对象没有这样的构造函数。即使它有这样的构造函数,它也只会创建一个 Employee 对象。

  2. printLine 是静态的,因为您需要先创建 TestEmployeeSortobject,才能使用非静态方法。但它没有任何意义(创建非静态对象),因为 printLine 不使用 TestEmployeeSortobject 的内部状态,所以在这种情况下它可以并且必须是静态的。

  3. compareTo 定义 whi 比其他的大。请参阅 API:返回:负整数、零或正整数,因为此对象小于、等于或大于指定对象。

因此,在这种情况下,如果 Id 更大,则作者决定 Employee 更大。您可以更改该方法以使用任何其他字段来定义排序顺序。

于 2011-08-09T12:15:56.557 回答
2

我可以添加多少项目?

您可以将项目添加到列表中,直到 Java VM 内存不足。没有人为的限制。

我可以做这样的事情吗?

col.add(new Employee(5, "Frank", 28, "asas", "asas"))

不,因为Employee没有接受这些参数的构造函数。但是你可以

col.add(new Employee(5, "Frank", 28));

这会在列表中为您提供两个非常相似但不相同的实例(它们不相同,因为它们位于内存中的不同位置;它们相似,因为所有字段都具有相同的值)。

为什么 printList 变成静态的?

因此可以从静态方法调用它,main()而无需创建TestEmployeeSort

这代表什么,o代表什么?

排序算法将选择列表中的两个项目,并compareTo()以另一个作为参数调用一个。前者会this,后者会在o

这样,排序算法就不需要知道太多关于它比较的对象。

优点是您可以轻松地使对象具有可比性。缺点是列表不能包含null指针或非Employee实例。

如果这对您不起作用,您可以创建一个Comparator也有一个compareTo方法但它需要两个参数的方法。

于 2011-08-09T12:12:21.350 回答
1

this引用对象的当前实例,o是 compareTo 函数的 Employee 参数。在不知道如何比较列表中的对象的情况下,您无法对列表进行排序,在这种情况下,您将比较员工 ID。

做一个也会更优雅 System.out.println(e.toString());

并覆盖 Employee 的 toString 方法,而不是为每个字段调用 getter。

于 2011-08-09T12:08:40.977 回答
1
  1. 如果您修改它的类变量和构造函数,您可以向 Employee 对象添加更多“项目”:

    公共类员工 { 私有 int empId; 私有字符串名称;私人年龄;

    // add new var
    private Object x;
    
    public Employee(int empId, String name, int age) {
        // set values on attributes
    }
    
    // add new construct
    public Employee(int empId, String name, int age, Object x) {
        //set the other attributes
    
        // this.x represents the current instance's x property, and x represents the parameter from the construct
        this.x = x;
    }
    // getters & setters
    

    }

要获取对象,我会推荐 myList.get(index)...

  1. 当然,您可以在 printList 方法中添加新变量。
  2. 查看@Sleeperson 的答案
于 2011-08-09T12:11:53.393 回答
1

我可以做这样的事情吗?

是的。

col.add(new Employee(5, "Frank", 28, "asas", "asas"))

Employee e = new Employee(5, "Frank", 28, "asas", "asas");
col.add(e);

我可以在这个员工对象中添加多少项目

你说的是名单吧?没有实际限制。

为什么printList做成静态的?

printList方法是一种实用方法。这与类的数据没有任何关系,并且有一些实用程序,并且不必存在于方法的每个实例中。进行一些格式化、记录和类似事情的方法通常是静态的。

比较时……这代表什么,o代表什么。

compareTo中,这是compareTo被调用的当前对象,并且o是传递给它的对象。所以当你说e1.compareTo(e2)e1is this and e2is o

于 2011-08-09T12:15:14.357 回答
1

第一个问题:不,除非有另一个构造函数,否则你不能

Employee (int, String, int, String, String)

第二个问题:我不确定你在问什么......我相信其他人可以提供帮助。

第三个问题:“this”表示调用方法 compareTo 的 Employee,“o”表示作为参数传递的员工。如果对象相等,大多数 compareTo 方法返回 0,在这种情况下,如果对象不相等,则返回任何其他值。因此,此方法比较员工 ID。如果是同一个Employee,this.empId - o.empId会返回0

于 2011-08-09T12:12:23.937 回答