2013-08-20 91 views
14

好吧,我花了好幾個小時試圖圍繞Java中的這個HashMap概念進行打包,但我無法弄清楚。我看了很多教程,但似乎沒有解決我的確切要求,我無法讓它工作。Java HashMap關聯多維數組無法創建或添加元素

我想在Java(或類似的東西)中創建一個關聯的多維數組,以便我可以使用字符串鍵來保存和檢索數組。

這是我會怎麼做PHP和它最能解釋什麼,我試圖做的:

//loop one - assign the names 
myArray['en']['name'] = "english name"; 
myArray['fr']['name'] = "french name"; 
myArray['es']['name'] = "spanish name"; 

//loop two - assign the description 
myArray['en']['desc'] = "english description"; 
myArray['fr']['desc'] = "french description"; 
myArray['es']['desc'] = "spanish description"; 

//loop three - assign the keywords 
myArray['en']['keys'] = "english keywords"; 
myArray['fr']['keys'] = "french keywords"; 
myArray['es']['keys'] = "spanish keywords"; 

//later on in the code be able to retrive any value similar to this 
english_name = myArray['en']['name']; 
french_name = myArray['fr']['name']; 
spanish_name = myArray['es']['name']; 

這是我在Java的嘗試,但它不工作:

HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>(); 

myArray.put("en" , put("name", "english name")); //gives me "cannot find symbol" at second put 

myArray.put("en" , ("name", "english name")); //gives me "')' expected" after second comma 

所以我確定它很簡單,但我請你指出,因爲這非常令人沮喪!

感謝

編輯:

因此,這裏是我是如何實現我接受的答案一定的工作代碼:

import java.util.*; 

HashMap<String, HashMap<String, String>> finalArray = new HashMap<String, HashMap<String, String>>(); 

String[] langArray = {"en","fr","de","no","es"}; 

//Initialize each language key ahead of time 
for(String lang : langArray) { // foreach lang in langArray 
    if (!finalArray.containsKey(lang)) { 
    finalArray.put(lang, new HashMap<String, String>()); 
    } 
} 

//loop one - assign names 
for(String lang : langArray) { 
    String theName = lang + " name"; //go get the name from somewhere 
    finalArray.get(lang).put("name", theName); 
} 

//loop two - assign description 
for(String lang : langArray) { 
    String theDesc = lang + " description"; //go get the description from somewhere 
    finalArray.get(lang).put("desc", theDesc); 
} 

//loop three - assign keywords 
for(String lang : langArray) { 
    String theKeys = lang + " keywords"; //go get the keywords from somewhere 
    finalArray.get(lang).put("keys", theKeys); 
} 

//display output 
for(String lang : langArray) { 
    System.out.println("LANGUAGE: " + lang); 
    System.out.println(finalArray.get(lang).get("name")); 
    System.out.println(finalArray.get(lang).get("desc")); 
    System.out.println(finalArray.get(lang).get("keys")); 
} 

//example to retrieve/get values 
String english_name = finalArray.get("en").get("name"); 
String french_desc = finalArray.get("fr").get("desc"); 
+0

讀一些答案我看到,經過好它並不那麼簡單!感謝您的迴應! – jsherk

回答

18
HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>(); 

if (!myArray.containsKey("en")) { 
    myArray.put("en", new HashMap<String, String>()); 
} 
myArray.get("en").put("name", "english name"); 

在Java中,你必須明確有關當你創建一個對象時。在這種情況下,首先我們檢查是否已經存在HashMap對象存儲在我們的外部HashMap下的鍵「en」。如果不是,我們創建一個空的。

現在要把一個新的價值,我們必須先從外部HashMap得到它,然後把新的價值。

+0

好吧,這適用於我的用例場景。然後我可以隨時給每個語言鍵添加'name'和'desc'和'keys'!我已經標明這是正確的。 – jsherk

2

不幸的是,沒有簡潔的語法來構造Java中的填充地圖。你必須把它寫出來。一個單獨的輔助方法,可以把它稍微簡單:

HashMap<String, String> makeMap(String name, String desc, String keys) { 
    HashMap<String, String> map = new HashMap<>(); 
    // Before Java 7, above must be: new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("desc", desc); 
    map.put("keys", keys); 
} 

然後:

HashMap<String, HashMap<String, String>> myArray = new HashMap<>(); 
myArray.put("en", 
    makeMap("english name", "english description", "english keywords")); 
// etc. 

您將與檢索:

english_name = myArray.get("en").get("name"); 
+0

我不確定這是否會起作用,因爲我沒有在同一時間添加它們。我需要在一個循環中添加名稱,然後在另一個循環中添加desc,並在第三個循環中再次添加鍵。我已經更新了上面的PHP示例以更好地說明我正在嘗試執行的操作。 – jsherk

1
HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>(); 
HashMap<String, String> value = new HashMap<String, String>(); 
value.put("name", "English name"); 
value.put("desc", "English description"); 
value.put("keys", "English keywords"); 

myArray.put("en" , value); 

value = new HashMap<String, String>(); 
value.put("name", "French name"); 
value.put("desc", "French description"); 
value.put("keys", "French keywords"); 

myArray.put("fr" , value); 
+0

'name','desc'和'keys'不會同時分配,所以這不適用於我。他們被分配在不同的循環中,所以我最終沒有'name',沒有'desc',只剩下'keys'。我已經更新了上面的PHP示例以更好地說明我正在嘗試執行的操作。 – jsherk