2010-11-21 33 views
6

Tôi có HashMApCách lặp lại từ đầu đến cuối trong HashMap?

items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

Tôi cần cho mỗi người cuối cùng trước tiên.

"C", "3" 
"B", "2" 
"A", "1" 
+0

Cụm từ Cuối cùng và Đầu tiên dường như biểu thị thời gian. Hầu hết các câu trả lời tôi thấy giả sử Cuối cùng và Đầu tiên là ngữ nghĩa (ví dụ: C lớn hơn A và do đó Cuối cùng). OrderedMaps sẽ không giúp bạn nếu bạn cần đặt hàng thời gian chèn và không có dấu thời gian chèn trong khóa. – extraneon

+1

'HashMap' không đảm bảo bất kỳ thứ tự nào cho các thành phần của nó. Đặc biệt, nó không đảm bảo rằng thứ tự vẫn không đổi theo thời gian. Do đó, 'HashMap' không phải là thứ bạn muốn nếu bạn phải duy trì bất kỳ thứ tự nào. – barjak

Trả lời

4

EDIT: Bản thân tôi và Matthew rõ ràng có cách giải thích khác nhau về ý nghĩa của câu hỏi của bạn. Bạn có nghĩa là thứ tự đảo ngược mà bạn đã chèn hoặc thứ tự các phím ngược lại không?

Nếu bạn có nghĩa là thứ tự của phím đảo ngược, dưới đây là cách để làm điều đó:

Sử dụng Bản đồ ra lệnh, như TreeMap và sau đó lặp trên items.keySet().

loại TreeMap bởi trật tự tự nhiên của các giá trị quan trọng của bạn, vì vậy bạn sẽ cần phải vượt qua trong một so sánh để các nhà xây dựng để sắp xếp các phím theo thứ tự ngược:

Map<String, String> items = new TreeMap<String, String>(new Comparator<String>() { 
    public int compare(String a, String b) { 
    return b.compareTo(a); 
    } 
}); 

items.put("A", "1"); 
items.put("B", "2"); 
items.put("C", "3"); 

for (String s: items.keySet()) { 
    System.out.println(s + " " + items.get(s)); 
} 
+3

Mã này tương đương: 'Bản đồ mục = new TreeMap (Collections.reverseOrder());' – barjak

+0

Ồ tuyệt vời - chưa từng thấy trước – iftheshoefritz

1

HashMap không đảm bảo bất kỳ yêu cầu nào. Nếu bạn sử dụng LinkedHashMap, nó sẽ được đặt hàng bằng cách chèn, nhưng vẫn không có cách thuận tiện để đi ngược.

Một cách có thể là gọi items.entrySet(). Điều đó trả về một Set<Map.Entry>. Sau đó bạn có thể nhận được kích thước của bộ, gọi toArray(), sau đó thực hiện giảm dần cho vòng lặp.

0

Phương pháp khác - tạo ra một SortedSet chìa khóa của bạn :

import java.util.*; 

class MyComparator implements Comparator<String> { 
    public int compare(String a, String b) { 
     return -a.compareTo(b); 
    } 

    public boolean equals(String a, String b) { 
     return a.equals(b); 
    } 
} 

public class test { 
    public static void main(String[] args) { 
     HashMap<String, String> items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

     TreeSet<String> ts = new TreeSet<String>(new MyComparator()); 
     ts.addAll(items.keySet()); 
     for(Iterator<String> i = ts.iterator(); i.hasNext();) { 
      String key = i.next(); 
      System.out.println("key: " + key + ", value: " + items.get(key)); 
     } 
    } 
} 

đầu ra:

 
key: C, value: 3 
key: B, value: 2 
key: A, value: 1 
+0

Bạn cho rằng Cuối cùng nằm trong ngữ cảnh của chìa khóa, nhưng tôi nghĩ rằng ông có nghĩa là thời gian chèn. Nếu thời gian chèn không nằm trong khóa, bộ so sánh không thể giúp bạn. – extraneon

+0

Tôi không đồng ý. Tôi không nghĩ rằng thời gian chèn có bất cứ điều gì để làm với nó. Tôi nghĩ rằng anh ta đã mắc sai lầm khi nghĩ rằng HashMap có thể được lặp lại theo thứ tự nào đó và muốn nó đảo ngược. Tôi cho rằng thứ tự anh ta muốn nói là chữ cái. – sje397

6

Bạn có thể sử dụng NavigableMap (TreeMapNavigableMap), là SortedMap có khả năng điều hướng.

NavigableMap#descendingMap() trả lại chế độ xem thứ tự ngược lại (không phải bản sao) của ánh xạ có trong bản đồ này.

Ví dụ:

NavigableMap<String, String> items = new TreeMap<String, String>(); 
items.put("B", "2"); 
items.put("A", "1"); 
items.put("C", "3"); 

for (Map.Entry<String, String> e : items.entrySet()) { 
    System.out.println(e); 
} 
// gives 
// A=1 
// B=2 
// C=3 

for (Map.Entry<String, String> e : items.descendingMap().entrySet()) { 
    System.out.println(e); 
} 

// gives 
// C=3 
// B=2 
// A=1 

Lưu ý: Câu trả lời này là hợp lệ nếu bạn quan tâm đến trật tự tự nhiên trong những chìa khóa trong Map của bạn. Nếu bạn quan tâm đến thứ tự chèn hoặc thứ tự truy cập, hãy xem LinkedHashMap.

Lưu ý 2: Trong câu hỏi của bạn, bạn đã sử dụng HashMap. Xin lưu ý rằng HashMap không đảm bảo bất kỳ thứ tự nào cho các thành phần của nó. Trên thực tế, nó thậm chí không đảm bảo trật tự sẽ vẫn không đổi theo thời gian. Xem đoạn đầu tiên của HashMap 's javadoc để tham khảo thêm.

+0

Thứ tự dựa trên ngữ nghĩa chính. Nhưng tôi nghĩ câu hỏi là về thời gian chèn. Vì vậy, một thứ tự ngược lại sẽ không giúp bạn như là thứ tự criterium (chèn thời gian) không phải là một phần của khóa. – extraneon

+0

Tôi đã thêm ghi chú để làm rõ mọi thứ – barjak

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