2008-09-24 19 views

Trả lời

14

Không, không nhất thiết. Bạn thực sự nên sử dụng trình nhập mục(). Iterator() cho mục đích này. Với trình lặp này, bạn sẽ đi qua tất cả các đối tượng Map.Entry trong Bản đồ và có thể truy cập từng khóa và giá trị được liên kết.

0

Câu hỏi làm tôi bối rối lúc đầu nhưng @Matt đã giải thích cho tôi.

Xem xét sử dụng phương thức entrySet() trả về tập hợp với cặp khóa-giá trị trên Bản đồ.

Map<Integer, Integer> a = new HashMap<Integer, Integer>(2); 
a.put(1, 2); 
a.put(2, 3); 
for (Map.Entry<Integer, Integer> entry : a.entrySet()) { 
    System.out.println(entry.getKey() + " => " + entry.getValue()); 
} 

đầu ra này:

1 => 2 
2 => 3 
3 => 3 
+0

tôi nghĩ đó là câu hỏi đầu tiên, nhưng có vẻ như anh ấy lặp lại các khóa và giá trị một cách độc lập bằng cách sử dụng các phương thức .keys() và .values ​​(). tôi không nghĩ rằng LinkedHashMap giải quyết vấn đề trong trường hợp này – Matt

+0

Cảm ơn Matt - khiến tôi bối rối ở đó :). –

+0

Trên một lưu ý khác, bạn không bao giờ nên tạo một HashMap có cùng kích thước với số lượng các phần tử mong muốn. HashMaps có một loadfactor thường là 75%. Điều này có nghĩa rằng nếu bản đồ đầy đủ 75% và bạn thêm một phần tử, nó sẽ tăng kích thước của nó. –

2

Cả hai giá trị() và keySet() ủy nhiệm cho bộ lặp nhập vàoSetSet() để chúng sẽ được trả về theo cùng thứ tự. Nhưng giống như Alex nói tốt hơn nhiều là nên sử dụng trình lặp() iterator nhập trực tiếp.

+0

Đây là chi tiết triển khai. Tôi không nghĩ rằng có bất kỳ đảm bảo rằng điều này là đúng sự thật. –

8

sử dụng entrySet rằng @Cuchullain đề cập:

Map<String, String> map = new HashMap<String, String>(); 

// populate hashmap 

for (Map.Entry<String, String> entry : map.entrySet()) { 
    String key = entry.getKey(); 
    String value = entry.getValue(); 
    // your code here 
} 
7

Bạn muốn sử dụng này, LinkedHashMap, cho khả năng dự đoán trật tự lặp

+0

... hoặc LinkedHashSet nếu bạn cần một bộ đặt hàng xác định –

0

Tôi thứ hai @basszero. Trong khi

for (Map.Entry<Integer, Integer> entry : a.entrySet()) 

sẽ hoạt động, tôi thấy sử dụng cấu trúc dữ liệu tự động làm đẹp hơn. Bây giờ, bạn có thể chỉ cần lặp lại "bình thường"

0

Phương thức set của HashMap trả về một Tập hợp, không đảm bảo trật tự.
Phương thức values ​​() của HashMap trả về một Collection, không đảm bảo trật tự.

Điều đó nói rằng, câu hỏi là "chúng sẽ tương quan" về mặt kỹ thuật câu trả lời là có thể, nhưng không dựa vào nó.

1

Tôi đồng ý với pmac72. Đừng cho rằng bạn sẽ nhận được các giá trị hoặc khóa đặt hàng từ một bộ sưu tập không có thứ tự. Nếu nó hoạt động theo thời gian thì đó chỉ là nguy hiểm thuần túy. Nếu bạn muốn trật tự được bảo tồn, hãy sử dụng LinkedHashMap hoặc TreeMap hoặc bộ sưu tập commons OrderedMap.

3
public class Test { 
public static void main(String[] args) { 
    HashMap <String,String> hashmap = new HashMap<String,String>(); 
    hashmap.put("one", "1"); 
    hashmap.put("two", "2"); 
    hashmap.put("three", "3"); 
    hashmap.put("four", "4"); 
    hashmap.put("five", "5"); 
    hashmap.put("six", "6"); 

    Iterator <String> keyIterator = hashmap.keySet().iterator(); 
    Iterator <String> valueIterator = hashmap.values().iterator(); 

    while(keyIterator.hasNext()) { 
    System.out.println("key: "+keyIterator.next()); 
    } 

    while(valueIterator.hasNext()) { 
    System.out.println("value: "+valueIterator.next()); 
    } 
} 
} 

key: two 
key: five 
key: one 
key: three 
key: four 
key: six 
value: 2 
value: 5 
value: 1 
value: 3 
value: 4 
value: 6 
Các vấn đề liên quan