ArrayList,static和Java如何在Java中工作?

时间:2011-08-09 12:01:01

标签: java static arraylist this comparable

我正在阅读文章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在这里意味着什么?

6 个答案:

答案 0 :(得分:2)

  

我可以添加多少项?

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

  我可以做这样的事吗?

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

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

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

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

  

为什么printList变为静态?

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

  

这代表什么代表什么?

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

这样,排序算法不需要了解它所比较的​​对象。

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

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

答案 1 :(得分:2)

约翰,

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

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

  1. 如果修改了类变量和构造函数,可以向Employee对象添加更多“items”:

    公共类员工{     private int empId;     私有字符串名称;     private int age;

    // 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
    

    }

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

    1. 当然,您可以在printList方法中添加新变量。
    2. 查看@Sleeperson的答案

答案 4 :(得分:1)

第一个问题:除非有另一个构造函数

,否则你不能
Employee (int, String, int, String, String)

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

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

答案 5 :(得分:1)

  

我可以这样做吗?

是。

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

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

我可以在此员工对象中添加多少项

你的名单对吗?没有实际限制。

  

为什么printList变成了静态?

printList方法是实用程序方法。这与类的数据无关,并且与某些实用程序有关,并且不必存在于方法的每个实例中。做一些格式化,日志记录和这类东西的方法通常是静态的。

  

在比较......这代表什么和代表什么。

compareTo中,这是调用compareTo的当前对象,o是传递给它的对象。 因此,当您说e1.compareTo(e2)时,e1就是这个而e2o