2015-06-28 20 views
2

Collection Interface誤區Collection接口的Java教程

在我看來,這個例子的代碼需要更正:

Map<Employee, Employee> m = new HashMap<Employee, Employee>(managers); 
m.values().removeAll(managers.keySet()); 

Set<Employee> slackers = m.keySet(); // this line should be changed to 

Set<Employee> slackers = m.values(); 

有人可以證實?

+0

爲什麼選擇投票?這是一個有效的問題。如果您認爲不需要更正,您可以向我指出。 – abc

+0

你能解釋一下你爲什麼這麼認爲?請注意我沒有投票.. – hagrawal

+0

@hagrawal請閱讀示例文本,然後查看示例代碼,您可能會看到錯誤。 – abc

回答

5

如果您知道該代碼應該做什麼,您只能知道該代碼是否需要更正。這裏是上下文:

一旦你這樣做了,你可能會有一羣員工的經理不再爲公司工作(如果任何西蒙的直接報告本身就是經理)。以下代碼將告訴您哪些員工擁有不再爲公司工作的經理。

Map<Employee, Employee> m = new HashMap<Employee, Employee>(managers); 
    m.values().removeAll(managers.keySet()); 
    Set<Employee> slackers = m.keySet(); 

於是我們開始了一個地圖,每一個現有員工映射到一個經理。然後我們刪除經理是當前員工的所有條目。這給我們留下了一張地圖,其中僅包含經理不是員工的員工的條目。最後,我們得到了一套鑰匙......這給了我們這些員工一套。

這對我來說似乎是正確的。

您建議的最後一行應該是:

Set<Employee> slackers = m.values(); 

這將使你是誰留下的所有管理人員。但這不是問題所要求的答案。 (除此之外,m.values()將返回Collection不是Set


TL; DR - 在本教程中沒有錯誤。


1 - 除了不正確的假設,如果沒有一個經理僱員將是一個懶鬼:-)。

+2

明白了。我專注於找到不再是公司僱員的經理。但是,教程正確地找到了經理不再是公司僱員的僱員。 – abc

+0

我在這裏看不到地圖'm'的任何修改。 'm.values()'返回一個包含所有管理器的集合,然後代碼通過刪除一些條目來修改該集合('.removeAll(managers.keySet())')。畢竟,'m'沒有被修改,這意味着它與原來的'managers'映射仍然是相同的映射。你可以解釋嗎? –

+1

@ HieuM.Nguyen - 從'values()'集合中刪除元素會從底層地圖中刪除條目。 javadoc這樣說。 –