2013-08-20 62 views
14

Được rồi vì vậy tôi đã dành vài giờ cố gắng để quấn đầu của tôi xung quanh khái niệm này của HashMap trong Java nhưng tôi không thể tìm ra. Tôi đã xem xét nhiều hướng dẫn nhưng dường như không có gì để giải quyết yêu cầu chính xác của tôi và tôi không thể làm cho nó hoạt động.Java HashMap mảng đa chiều kết hợp không thể tạo hoặc thêm các thành phần

Tôi đang cố gắng tạo một mảng đa chiều kết hợp trong Java (hoặc một cái gì đó tương tự) để tôi có thể lưu và lấy từ mảng bằng các khóa là Strings.

Đây là cách tôi sẽ làm điều đó trong PHP và giải thích nó tốt nhất những gì tôi đang cố gắng để làm:

//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']; 

Đây là những gì tôi đã cố gắng trong Java nhưng nó không làm việc:

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 

Vì vậy, tôi chắc chắn rằng một cái gì đó đơn giản của nó mà tôi đang thiếu nhưng xin vui lòng chỉ ra bởi vì điều này là rất bực bội!

Cảm ơn

EDIT:

Vì vậy, đây là một số mã làm việc về cách tôi thực hiện câu trả lời tôi chấp nhận:

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

Vâng sau khi đọc một số câu trả lời tôi thấy rằng nó không đơn giản như vậy! Cảm ơn bạn đã trả lời! – jsherk

Trả lời

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"); 

Trong Java bạn phải rõ ràng về khi bạn đang tạo một đối tượng. Trong trường hợp này đầu tiên, chúng tôi kiểm tra xem đã có một đối tượng HashMap được lưu trữ ở bên ngoài của chúng tôi HashMap dưới khóa "vi" hay không. Nếu không, chúng ta sẽ tạo một cái trống.

Bây giờ để đặt một giá trị mới vào nó, trước tiên chúng ta phải lấy nó từ bên ngoài HashMap, sau đó đặt giá trị mới.

+0

Ok điều này hoạt động hoàn hảo cho trường hợp sử dụng của tôi. Sau đó tôi có thể thêm 'name' và' desc' và 'keys' vào mỗi khóa ngôn ngữ bất cứ lúc nào! Tôi đã đánh dấu điều này là chính xác. – jsherk

2

Thật không may, không có cú pháp ngắn gọn để xây dựng bản đồ được điền trong Java. Bạn sẽ phải viết nó ra một cách lâu dài. Một phương pháp helper riêng biệt có thể làm cho nó đơn giản hơn một chút:

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); 
} 

Sau đó:

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

Bạn sẽ lấy nó với:

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

Tôi không chắc chắn điều này sẽ làm việc như tôi không thêm tất cả cùng một lúc. Tôi cần phải thêm tên trong một vòng lặp sau đó desc trong một vòng lặp khác nhau và các phím một lần nữa trong một vòng thứ ba. Tôi đã cập nhật ví dụ PHP của tôi ở trên để minh họa tốt hơn những gì tôi đang cố gắng làm. – 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' và 'keys' sẽ không được chỉ định cùng một lúc, vì vậy điều này không hoạt động đối với tôi. Họ được chỉ định trong các vòng lặp khác nhau vì vậy tôi kết thúc với không có 'tên' và không có' desc' và chỉ 'phím' còn lại. Tôi đã cập nhật ví dụ PHP của tôi ở trên để minh họa tốt hơn những gì tôi đang cố gắng làm. – jsherk