2012-05-14 33 views
-1

我正在編寫一個函數來測試HashMap是否具有空值。方法.values()應該返回一個只包含值的集合,但是我會收到一個映射,其中存儲了鍵和值。這是不好的,因爲我的函數的目的是檢查值是否爲null,但是如果我返回帶有AND值的映射,那麼.values()。如果我有一個沒有值存儲的密鑰,則isEmpty()返回false。如何從HashMap中檢索值的集合

public Map<KEY, List<VALUES>> methodName() { 
    if (MAPNAME.values().isEmpty()) { 
      throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01)); 
     } else { 
      return MAPNAME; 
     } 
    } 

在上述例子中,.values()總是返回一個包含所有的鍵和值的映射圖。如果HashMap有一個鍵,我的方法永遠不會拋出一個CustomErrorException,因爲它應該檢測是否沒有值,所以它是不好的。幫幫我!

+0

什麼是MAPNAME? – jahroy

+0

@jahroy地圖> MAPNAME =新的HashMap >(); – tamuren

+1

HashMaps允許空值和一個空鍵。 – jahroy

回答

4

有沒有這樣的事情作爲一個地圖實現有一個密鑰存儲沒有價值。所有的Map實現兩種:

  • 拋出一個異常,在put當值爲null
  • 添加一鍵條目和空值

映射到空的關鍵是非常不同的比沒有價值的鑰匙。該鍵有一個值,並且該值爲空(並且這意味着值集合不會爲空,除非映射爲空)。沒有值的鍵是不包含在地圖中的鍵。長話短說,你可能想用MAPNAME.values().contains(null)甚至只是MAPNAME.containsValue(null)做你想做的。或者,如果您將每個密鑰映射都檢查爲,則通過遍歷.values()集合來檢查該映射。

+0

感謝您爲我清理Google地圖的概念。使用MAPNAME.values()。contains(null)適用於我的目的。最後一件事--value()應該做什麼?就我而言,它返回了整個哈希映射,鍵AND值。我只是想要一個值的數組來執行邏輯。 – tamuren

+0

對不起,但你在這方面弄錯了。 HashMap.values()絕對不會返回一個HashMap。由於HashMap和Map沒有實現Collection,如果HashMap從values()返回,它甚至不會編譯。 values()方法返回一個Collection,其中包含由鍵引用的每個值。可以有重複(不是一個集合),所以如果3個鍵映射到'null',那麼'null'將在集合中出現3次。另外,從值集合中刪除值也會更新地圖。 –

+0

在eclipse中,如果我在調試器中遍歷我的代碼,並且檢查我的HashMap中包含的「值」,它會顯示「this」。如果我擴展'this',它包含整個HashMap,包括鍵和值(值導致另一個'this',導致一系列包含在另一箇中的無限HashMap)。只是說' – tamuren

1

您傳回地圖 - MAPNAME,而不是值:

return MAPNAME.values(); 
+0

是的,你說得對 - 我正在返回HashMap。我的問題是,如果在HashMap中有一個鍵,我的if語句將永遠不會拋出一個錯誤異常,因爲理論場景中HashMap將存儲鍵但沒有值。 這不是這種方法的目的只返回HashMap中的值,而是返回整個HashMap中如果值是不是空/空。 – tamuren

0

如果你想確定映射包含任何空值,你應該遍歷值和檢查的集合每一個看看它是否爲空。

包含具有空值的條目的映射不是空的。

+0

問題是MAPNAME.values()正在返回一個哈希映射,即使文檔和幾個示例聲明它應該返回一個集合。實際上,它表示'values'的值是'this',也就是哈希映射'值'存儲在其中。 – tamuren

+1

HashMap是一個集合。 –

+0

然後更具體地說,我需要的是MAPNAME.values()返回一個只有存儲在裏面的NO鍵值的集合。目前情況不是這樣,因爲MAPNAME.values()返回一個包含所有鍵和所有值的映射。這是不是.values()應該工作的方式? – tamuren

0

你不是你想要什麼非常清楚 - 你的地圖值列表 - 考慮到,有三種方法可以有一個鍵映射爲「沒有價值」:

  • 的關鍵映射到null(則測試是map.values().contains(null)
  • 甲鍵映射到一個空列表(則測試是map.values().contains(Collections.emptyList())
  • 甲鍵映射到充滿null名單。

上面的方法正在執行的是如果地圖確實是空的(無鍵),則拋出異常,否則返回地圖。

目前尚不清楚你想要什麼。如果你想方法拋出只有在地圖上沒有有意義的值異常(所有的鍵映射或者爲空或空列表),那麼這樣的事情是你所需要的:

public Map<KEY, List<VALUES>> methodName() { 
    for(List<VALUES> values : MAPNAME.values()) // 1 
     if(null != values) // 2 
      for(VALUES value : values) // 3 
       if(null != value) // 4 
        return MAPNAME; 

    throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01)); 
} 

此拋出一個異常的所有合理可想到「空地圖」的場景 - 如果(1)在地圖上是真正空的,或者(2)它僅包含null鍵,或(3)僅僅包含null值或空列表,或(4)它僅包含null值或空列表或列表null s。

(在文本「空虛」測試水平高於對應於位於註釋標籤中的代碼)。