2012-09-05 30 views
12

Đối với một bản đồ như:Thứ tự lặp lại giống nhau trên Map.keySet và Map.values?

Map<Integer, Integer> map = ...; 
map.put(1, 1); 
map.put(2, 2); 
map.put(3, 3); 
map.put(4, 4); 

Là mã này ...

for (Integer i : map.keySet()) System.out.println(i); 
for (Integer i : map.values()) System.out.println(i); 

... đảm bảo in giống nhau cùng một chuỗi hai lần?

Nếu không, có bất kỳ bảo đảm nào trong ví dụ java.util.HashMap không?

+0

bản sao có thể có của [là thứ tự lặp Java HashMapSetSet() nhất quán?] (Http://stackoverflow.com/questions/1882762/is-the-java-hashmap-keyset-iteration-order-consistent) – assylias

+0

@ assylias: Câu hỏi này liên quan đến tập hợp khóa so với giá trị. – dacwe

+0

@daxwe là câu hỏi của bạn: sẽ 2 vòng in cùng một điều nếu chúng được gọi hai lần, hoặc là câu hỏi của bạn: vòng lặp trên các phím và trên các giá trị in khóa/giá trị tương ứng trong cùng một thứ tự? – assylias

Trả lời

16

Không, không bảo đảm, mặc dù trong thực tế nó sẽ xảy ra (không có lý do chính đáng để bản đồ sử dụng trình lặp khác cho khóa và giá trị).

Nếu bạn muốn đảm bảo lặp trật tự, lặp các entrySet():

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

Vì bạn hỏi về HashMap, cũng lưu ý rằng bất kỳ thay đổi bản đồ sẽ có khả năng thay đổi lặp trật tự, như là kết quả của mapbeing rehashed .

+0

Thay thế tốt, cảm ơn rất nhiều :) – Luvie

+0

Tôi chỉ đọc [Bản đồ javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--) và không có đảm bảo trật tự cho 'entrySet()'. bạn đã nhận được ở đâu đó từ đâu? – Roland

7

Không, không được bảo đảm. Một là Set và một là Collection, không đảm bảo thứ tự.

Nếu bạn muốn giữ trật tự. Có thể là LinkedHashMap() với entrySet() giúp bạn.

+1

+1 Ngay cả khi chúng được đặt hàng, không có gì đảm bảo rằng chúng sẽ có cùng thứ tự. ;) –

-1

Có. Sắp xếp. Bạn có thể sử dụng một lớp con của SortedMap, tức là TreeMap. Điều đó sẽ giữ chìa khóa theo thứ tự tự nhiên. (hoặc bạn có thể cho nó một bộ so sánh cụ thể). Nhưng khi bạn sử dụng bản đồ cây, bạn phải đảm bảo phương thức compareTo "phải phù hợp với bằng". Đọc javadocs để biết thêm chi tiết. Nhưng trong ngắn hạn, có, bạn CÓ THỂ sắp xếp một bản đồ.

+0

Câu hỏi đặt ra là liệu bạn có thể sắp xếp một bản đồ hay không, đó là tập hợp các khóa được trả về từ 'keySet()' và tập hợp các giá trị được trả về từ 'valueSet()' sẽ được sắp xếp sao cho khoá n: th trong tập hợp phím tương ứng với giá trị n: th trong tập hợp giá trị. Không có bảo đảm như vậy. Cũng không đảm bảo rằng thứ tự các khóa và giá trị được trả về từ 'keySet()' và 'valueSet()' đều giống nhau đối với hai lời gọi liên tiếp. – JHH

Các vấn đề liên quan