2012-02-13 71 views
0

這是從破解編碼採訪中得到的代碼。我不明白第4行和第5行。從我所看到的,它是數組列表的數組列表,但它對於它的定義有點困惑。請解釋一下這些行中實際發生的情況。數組列表?

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 } 

回答

3

這是創建ArrayLists的Array(而不是ArrayList)。隨着代碼的評論,有3個級別的員工。他們將每個級別存儲在employeeLevels陣列中的3個ArrayLists之一中。

或者,他們可以將每個員工級別存儲在自己的變量中 - 但這當然不具有可擴展性或靈活性。它也會讓每個級別的事情循環(比如,從#11-12行開始)要困難得多。

0

ArrayList [] employeeLevels = new ArrayList [LEVELS];

的ArrayList [] < ---這是類型定義

新的ArrayList [LEVELS]; < ---這是實例。

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

從我所看到的,它的ArrayList ArrayList的,但它是如何定義有點混亂。

它是ArrayList的數組

它的長度爲LEVELS(代碼中爲3),所有元素最初爲null。要使用這些插槽,您必須放入ArrayLists(不會在您顯示的代碼中發生)。

要獲得這些列表的個體,做

ArrayList<Employee> employeeLevel = employeeLevels[level]; 

但首先初始化入口,否則你只會得到空(空List)。

ArrayList<Employee> 

的東西在尖括號是一個通用的類型註釋。這意味着ArrayList只能存儲Employee(或其子類)的實例。所以總結一下,你有一個包含三個元素的數組,每個元素都是一個可以存儲Employee實例的List,或者它可以爲null。 「三個」列表不需要區分(您可以在所有三個插槽中放置相同的列表)。

0

從設計的角度來看

如果創建一個ArrayList中,你基本上是一個很大的靈活性添加到代碼。所以你不需要管理數組列表大小。如果您創建ArrayList [],則要對2D數組的一個維度進行限制。這樣你肯定知道一個維度是固定的。所以有點節省一些內存,並允許陣列中的每個ArrayList都能夠靈活地增長。

0

關於定義還應該注意一點。對於大多數開發人員來說,對接口進行編碼是一種很好的做法,而不是實現。所以定義應該看起來像List<Employee>[] employeeLevels = new ArrayList[LEVELS];