массив массивов? - PullRequest
       1

массив массивов?

0 голосов
/ 13 февраля 2012

Это код взят из интервью Cracking the coding. Я не понял строки № 4 и 5. Из того, что я вижу, это arraylist of arraylist, но он немного озадачен тем, как он определен.Пожалуйста, объясните мне, что на самом деле происходит в этих строках.

1 public class CallHandler {

2 static final int LEVELS = 3; // we have 3 levels of employees

3 static final int NUM_FRESHERS = 5; // we have 5 freshers

4 ArrayList<Employee>[] employeeLevels = new ArrayList[LEVELS];

5 // queues for each call’s rank

6 Queue<Call>[] callQueues = new LinkedList[LEVELS];
7
8 public CallHandler() { ... }
9
10 Employee getCallHandler(Call call) {

11 for (int level = call.rank; level < LEVELS - 1; level++) {

12 ArrayList<Employee> employeeLevel = employeeLevels[level];

13 for (Employee emp : employeeLevel) {

14 if (emp.free) {

15 return emp;

16 }

17 }

18 }

19 return null;

20 }

Ответы [ 5 ]

3 голосов
/ 13 февраля 2012
ArrayList<Employee>[] employeeLevels = new ArrayList[LEVELS];

Из того, что я вижу, это arraylist of arraylist, но он немного озадачен тем, как он определен.

Это массив ArrayLists.

Он имеет длину LEVELS (3 в вашем коде), все элементы изначально null. Чтобы использовать эти слоты, вы должны добавить ArrayLists (не происходит в коде, который вы показали).

Чтобы попасть к отдельным из этих списков, выполните

ArrayList<Employee> employeeLevel = employeeLevels[level];

, но сначала инициализируйте запись, иначе вы просто получите null ( не пустой список).

 ArrayList<Employee>

Материал в угловых скобках является аннотацией общего типа. Это означает, что ArrayList может хранить только экземпляры Employee (или их подклассы).

Итак, чтобы подвести итог, у вас есть массив с тремя элементами, каждый из которых является списком, который может хранить экземпляры Employee, или он может быть нулевым. «Три» списка не обязательно должны быть разными (вы можете поместить один и тот же список во все три слота).

3 голосов
/ 13 февраля 2012

Это создание массива (не ArrayList) из ArrayLists. Как прокомментирован код, есть 3 уровня сотрудников. Они хранят каждый уровень в одном из 3 списков массивов в массиве employeeLevels.

В качестве альтернативы, они могли бы хранить каждый уровень сотрудника в своей собственной переменной - но это, конечно, не так масштабируемо или гибко. Это также сделало бы такие вещи, как зацикливание на каждом уровне (как они, начиная со строки № 11-12) намного более трудным.

0 голосов
/ 13 февраля 2012

Следует отметить еще один момент, касающийся определения.Для большинства разработчиков рекомендуется кодировать интерфейсы, а не реализации.Таким образом, определение должно выглядеть так: List<Employee>[] employeeLevels = new ArrayList[LEVELS];

0 голосов
/ 13 февраля 2012

С точки зрения дизайна

Если вы создаете ArrayList, вы в основном добавляете большую гибкость в код.Так что вам не нужно управлять размерами массива.Если вы создаете ArrayList [], вы накладываете ограничение на одно измерение 2D-массива.Таким образом, вы точно знаете, что одно измерение фиксировано.Так что немного экономите память и дайте каждому ArrayList в вашем массиве возможность расти.

0 голосов
/ 13 февраля 2012

ArrayList [] employeeLevels = новый ArrayList [УРОВНИ];

ArrayList [] <--- это определение типа </p>

new ArrayList [LEVELS];<--- это экземпляр. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...