2013-04-08 24 views
5

Làm cách nào để chuyển đổi một số Map<K, V> thành danh sách List<K> keys, List<V> values, sao cho đơn đặt hàng trong keysvalues khớp? Tôi chỉ có thể tìm thấy Set<K> Map#keySet()Collection<V> Map#values() mà tôi có thể chuyển đổi vào danh sách sử dụng:Làm thế nào để chuyển đổi một Bản đồ <K, V> thành hai danh sách trong khi vẫn giữ trật tự?

List<String> keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(map.values()); 

nhưng tôi lo lắng rằng thứ tự sẽ là ngẫu nhiên.

Có đúng là tôi phải chuyển đổi thủ công chúng hoặc có lối tắt ở đâu đó không?

Cập nhật: Do các câu trả lời tôi đã có thể tìm thêm thông tin hữu ích mà tôi muốn chia sẻ với bạn, ngẫu nhiên dùng google: How to efficiently iterate over each Entry in a Map?

+0

Tôi nghĩ ArrayList giữ gìn trật tự trong đó chúng ta chèn. –

+2

@AchintyaJha vâng, có. Tuy nhiên, là bộ được trả lại bởi bản đồ đã ra lệnh? –

+0

+1 vì không giả định rằng hai bộ sưu tập (khóa và giá trị) sẽ có cùng thứ tự. – yshavit

Trả lời

10

Sử dụng Map.entrySet():

List<String> keys = new ArrayList<>(map.size()); 
List<String> values = new ArrayList<>(map.size()); 
for(Map.Entry<String, String> entry: map.entrySet()) { 
    keys.add(entry.getKey()); 
    values.add(entry.getValue()); 
} 
+0

+1, nhưng hãy nâng cấp lên Java 1.5 và sử dụng Generics. Sau khi tất cả, Java 1.8 là chỉ quanh góc. – yshavit

+0

Hoàn toàn đồng ý - Tôi chỉ không sử dụng một IDE và nhận được chúng ngay có thể được khôn lanh mà không có một. – rongenre

+1

Chỉnh sửa để phản ánh java 7 generics. –

1

Bạn nên trích xuất danh sách các phím như bạn đề cập đến và sau đó lặp trên chúng và trích xuất các giá trị:

List<String keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(); 
for(String key: keys) { 
    values.add(map.get(key)); 
} 
+1

Bạn cũng có thể lặp qua 'mục nhập', để nhận cả khóa và giá trị. –

+0

Đó là sự thật - sự phức tạp khôn ngoan là như nhau. – Avi

1

Bạn có thể lặp qua map.entrySet(), thêm khóa và giá trị vào hai danh sách.

1

Xin lưu ý rằng Map không phải là một sưu tập ra lệnh. Thứ tự lặp lại không cố định. Vì vậy, khi bạn thêm nhiều mục nhập vào Bản đồ của bạn, chúng sẽ xuất hiện tại các điểm ngẫu nhiên trong phép lặp và do đó sẽ không còn khớp với bất kỳ danh sách nào bạn đã tạo.

Nếu bạn cần trình tự lặp lại của một bản đồ để được giống như thứ tự chèn hơn có một cái nhìn tại LinkedHashMap

+0

Tôi không quan tâm đến thứ tự, ngoại trừ việc tôi cần một cặp (khóa, giá trị) ở cùng một "vị trí" trong hai danh sách kết quả. –

+0

Điều này không thực hiện 'trình lặp'? Đúng, bạn không thể chắc chắn trong đó thứ tự bản đồ là gì, nhưng bạn có thể chắc chắn rằng khi lặp qua 'entrySet',' Iterator' lặp lại theo thứ tự cụ thể. – GameDroids

+0

@MichaWiedenmann: sau đó bạn không có gì phải lo lắng khi đặt các giá trị trong hai danh sách của bạn. Chỉ cần chăm sóc đặc biệt khi thay đổi danh sách sau đó. – GameDroids

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