2012-09-07 30 views
33

Tôi đã khai báo LinkedHashMap sau đây.Cách lặp qua LinkedHashMap với các danh sách dưới dạng các giá trị

LinkedHashMap<String, ArrayList<String>> test1 

điểm của tôi là làm cách nào tôi có thể lặp qua bản đồ băm này. Tôi muốn làm điều này sau đây, cho mỗi phím có được danh sách array tương ứng và in các giá trị của arraylist từng cái một với phím.

tôi đã cố gắng này, nhưng được chỉ trả về chuỗi,

String key = iterator.next().toString(); 
ArrayList<String> value = (ArrayList<String>)test1.get(key) 

Trả lời

104
for (Map.Entry<String, ArrayList<String>> entry : test1.entrySet()) { 
    String key = entry.getKey(); 
    ArrayList<String> value = entry.getValue(); 
    // now work with key and value... 
} 

Bằng cách này, bạn thực sự cần khai báo các biến của bạn như các loại giao diện thay vào đó, chẳng hạn như Map<String, List<String>>.

+2

btw, tôi muốn có danh sách với thứ tự chèn, tôi sử dụng hashmap trước nhưng nó làm xáo trộn trật tự. –

+4

Tôi không nói không sử dụng 'LinkedHashMap' - nhưng thực tế tốt nhất là khai báo những thứ như' Bản đồ > map = new LinkedHashMap > '. –

+1

@Pbasak Bạn chỉ sử dụng loại giao diện cho khai báo. Khi bạn khởi tạo đối tượng bản đồ, bạn vẫn sẽ sử dụng 'LinkedHashMap' của mình để đảm bảo rằng thứ tự chèn vẫn giữ nguyên. Bằng cách này, bạn gắn bó với lựa chọn triển khai của mình nhưng vẫn sử dụng loại tổng quát hơn ở bên ngoài. –

5

Bạn có thể sử dụng mục nhập và lặp lại các mục nhập cho phép bạn truy cập cả khóa, giá trị và trực tiếp.

for (Entry<String, ArrayList<String>> entry : test1.entrySet() { 
    System.out.println(entry.getKey() + "/" + entry.getValue()); 
} 

tôi đã cố gắng này, nhưng được chỉ trả về chuỗi

Tại sao bạn nghĩ như vậy? Phương thức get trả về loại E mà thông số loại chung được chọn, trong trường hợp của bạn là ArrayList<String>.

7
// iterate over the map 
for(Entry<String, ArrayList<String>> entry : test1.entrySet()){ 
    // iterate over each entry 
    for(String item : entry.getValue()){ 
     // print the map's key with each value in the ArrayList 
     System.out.println(entry.getKey() + ": " + item); 
    } 
} 
+2

Không bao giờ nghĩ về điều này, tôi sử dụng foreach trong C#, điều này là tương tự như vậy. –

11

Tôi giả sử bạn có một lỗi đánh máy trong bản Tuyên Bố get của bạn và rằng nó nên được test1.get (key). Nếu vậy, tôi không chắc tại sao nó không trả về ArrayList trừ khi bạn không đưa đúng loại vào bản đồ ngay từ đầu.

này nên làm việc:

// populate the map 
Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.put("key1", new ArrayList<String>()); 
test1.put("key2", new ArrayList<String>()); 

// loop over the set using an entry set 
for(Map.Entry<String,List<String>> entry : test1.entrySet()){ 
    String key = entry.getKey(); 
    List<String>value = entry.getValue(); 
    // ... 
} 

hoặc bạn có thể sử dụng

// second alternative - loop over the keys and get the value per key 
for(String key : test1.keySet()){ 
    List<String>value = test1.get(key); 
    // ... 
} 

Bạn nên sử dụng tên giao diện khi tuyên bố vars của bạn (và trong params generic của bạn) trừ khi bạn có một lý do rất cụ thể tại sao bạn xác định bằng cách sử dụng triển khai.

+0

Xin chào, tôi đã sử dụng linkhashmap để giữ các phần tử trong thứ tự chèn. –

+0

Chắc chắn - nhưng bạn có thể chỉ định LinkedHashMap khi tạo cá thể. Tuy nhiên, việc sử dụng tên giao diện cho biến cho phép bạn thực hiện việc triển khai mã độc lập. tức là: bạn có thể dễ dàng thay thế việc triển khai bằng một cái gì đó khác tại một thời điểm sau đó mà không cần phải mã hóa lại mọi thứ. Xem ví dụ trên của tôi để khai báo bằng cách sử dụng giao diện dưới dạng var và LinkedHashMap để thực hiện. –

2

Trong Java 8:

Map<String, List<String>> test1 = new LinkedHashMap<String, List<String>>(); 
test1.forEach((key,value) -> { 
    System.out.println(key + " -> " + value); 
}); 
Các vấn đề liên quan