2011-07-31 23 views
47

是否有可能在Java中,使與它裏面已經聲明中有關項目的字典?就像下面的C#代碼:C#與Java - 字典?

Dictionary<string, int> d = new Dictionary<string, int>() 
    { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

我該怎麼做,我使用什麼類型?我讀過那本詞典已經過時了。

回答

68

這會做你想要什麼:

Map<String,Integer> map = new HashMap<String, Integer>(){{ 
    put("cat", 2); 
    put("dog", 1); 
    put("llama", 0); 
    put("iguana", -1); 
}}; 

此語句創建的HashMap中,一個匿名子類,其中從父類唯一的區別是,在實例創建過程中添加了4個條目。這是在Java世界中相當常見的成語(雖然有些人覺得它有爭議的,因爲它會創建一個新的類定義)。

由於這種爭議,因爲Java 9的有一種方便的地圖構建一個新成語:靜態Map.of methods家庭。

在Java 9或更高您可以創建所需的地圖如下:

Map<String, Integer> map = Map.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 

對於較大的地圖,這alternative syntax可以是不易出錯:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2), 
    Map.entry("dog", 1), 
    Map.entry("llama", 0), 
    Map.entry("iguana", -1) 
); 

(這是特別如果Map.entry是靜態導入的,而不是被顯式引用的話,那就很好)。

而且只能在Java 9+工作,這些新方法都不太等同於前一個:

  • 他們不會允許你指定使用什麼地圖實現
  • 他們只創造永恆不變地圖
  • 他們不創建地圖的匿名子類

然而,這些分歧不應該的問題對於很多使用情況,使之成爲一個很好的默認方式爲更新版本的Java。

+0

實際上它。謝謝。 – WildBamaBoy

+2

這裏是對這是做什麼的解釋。 http://techpolesen.blogspot.com/2007/08/java-initializers-add-elements-to.html –

+0

嗯...雙大括號的語法不被認爲是好的風格 –

12
Map<String,Integer> map = new HashMap<String, Integer>(){{ 
put("cat", 2); 
put("dog", 1); 
put("llama", 0); 
put("iguana", -1); 
}}; 
+0

哇有人已經發布了這個...... – fireshadow52

+0

這不能編譯,你的答案在編輯之前是正確的。 – Affe

4

咬住子彈並輸入地圖名稱!

Map<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("cat", 2); 
    map.put("dog", 1); 
    map.put("llama", 0); 
    map.put("iguana", -1); 

你也可以做這樣的事情,這可能會節省一些打字一個長長的清單:

Object[][] values = { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

    for (Object[] o : values) { 
     map.put((String) o[0], (Integer) o[1]); 
    } 
+1

不行!太多打字。 :P – WildBamaBoy

0

Java7幾乎介紹了「收集的文字」,將允許語法這樣。他們可能會試圖用Java8推它。我不知道這些人有什麼問題。

這可以通過某種形式的封裝API

Map<String,Integer> map = Maps.<String,Integer>empty() 
    .put("cat", 2).put("dog",1)....; 

差不太多可以輕鬆實現。我寧願像

map("cat", "dog", ...) 
.to( 1,  2, ...); 

這種事情必須由不同的人來實現,不幸的是,標準的API不inculde這樣的事情。

3

如果使用Guava library,則可以使用其ImmutableMap類,通過其自身(實施例1和2),或作爲一個HashMap的初始化(實施例3和4):

Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build(); 
Map<String, Integer> map2 = ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 
Map<String, Integer> map3 = Maps.newHashMap(
    ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build() 
); 
Map<String, Integer> map4 = Maps.newHashMap(ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1) 
);