Как работает ArrayList, static и все это в Java? - PullRequest
0 голосов
/ 09 августа 2011

Я просматривал статью Сортировка Java: 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. Это ArrayList объектов Employee. Сколько предметов я могу добавить в этот объект сотрудника? Могу ли я сделать что-то подобное?

    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 ]

2 голосов
/ 09 августа 2011

Джон,

  1. col.add принимает только один Bject.Итак, вы создаете один объект Employee с новой операцией и добавляете в него список.Таким образом, вы не можете использовать это - новый Employee (5, «Frank», 28, «asas», «asas»), потому что объект Employee не имеет такого конструктора.Даже если у него есть такой конструктор, он создает только один объект Employee.

  2. printLine является статическим, поскольку сначала необходимо создать TestEmployeeSortobject, чтобы использовать нестатический метод.Но это не имеет никакого смысла (создавать нестатический объект), потому что printLine не использует внутреннее состояние TestEmployeeSortobject, поэтому в этом случае он может быть и должен быть статическим.

  3. сравнить, чтобы определить, что больше, чем другие.См. API: Возвращает: отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше указанного объекта.

Итак, в этом случаеАвтор решает, что Сотрудник больше, если Id больше.Вы можете изменить этот метод, чтобы использовать любое другое поле для определения порядка сортировки.

2 голосов
/ 09 августа 2011

сколько предметов я могу добавить?

Вы можете добавлять элементы в список, пока у виртуальной машины Java не закончится память. Нет искусственного ограничения.

Могу ли я сделать что-то подобное?

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 голос
/ 09 августа 2011

Могу ли я сделать что-то подобное?

Да.

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 - это и e2 - o.

1 голос
/ 09 августа 2011

Первый вопрос: Нет, вы не можете, если нет другого конструктора, который

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

Второй вопрос: я не уверен, что вы спрашиваете ... Я уверен, что кто-то еще может помочь, хотя.

Третий вопрос: «this» представляет сотрудника, вызывающего метод compareTo, а «o» представляет сотрудника, переданного в качестве аргумента.Большинство методов compareTo возвращают 0, если объекты равны, и в этом случае что-нибудь еще, если объекты не равны.Таким образом, этот метод сравнивает идентификаторы сотрудников.Если это тот же Сотрудник, this.empId - o.empId вернет 0

1 голос
/ 09 августа 2011
  1. Вы можете добавить больше "элементов" к объекту Employee, если измените его переменные класса и конструктор:

    открытый класс Employee {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
    

    }

Для получения объектов я бы рекомендовал myList.get (index) ...

  1. Конечно, вы можете добавить новую переменную в метод printList.
  2. см. Ответ @ Sleeperson
1 голос
/ 09 августа 2011

this ссылается на текущий экземпляр вашего объекта, o - параметр Employee функции compareTo. Вы не можете отсортировать список, не зная, как сравнивать объекты в списке, в этом случае вы сравниваете идентификаторы сотрудников.

Также было бы более элегантно сделать System.out.println(e.toString());

и переопределение метода toString для Employee вместо вызова методов получения для каждого поля.

...