2009-02-20 29 views

Trả lời

68

Sử dụng TreeMap, đây là triển khai giao diện SortedMap. Nó trình bày các phím của nó theo thứ tự sắp xếp.

Map<String, Object> map = new TreeMap<String, Object>(); 
/* Add entries to the map in any order. */ 
... 
/* Now, iterate over the map's contents, sorted by key. */ 
for (Map.Entry<String, ?> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + ": " + entry.getValue()); 
} 

Nếu bạn đang làm việc với một thực hiện Bản đồ mà không được sắp xếp theo ý muốn, bạn có thể vượt qua nó để constructor của TreeMap để tạo ra một bản đồ mới với các phím được sắp xếp.

void process(Map<String, Object> original) { 
    Map<String, Object> copy = new TreeMap<String, Object>(original); 
    /* Now use "copy", which will have keys in sorted order. */ 
    ... 
} 

Một TreeMap làm việc với bất kỳ loại hình chính mà thực hiện giao diện Comparable, đặt chúng theo thứ tự "tự nhiên" của họ. Đối với các khóa không phải là Comparable hoặc có thứ tự tự nhiên không phải là thứ bạn cần, bạn có thể triển khai Comparator của riêng mình và chỉ định điều đó trong constructor.

+0

Mã tôi đang tiêu thụ mang lại cho tôi đối tượng Bản đồ, vậy làm cách nào để chuyển đổi nó thành TreeMap hoặc sử dụng TreeMap để sắp xếp? – Bialecki

+0

Bạn có thể tạo TreeMap bằng cách sử dụng một hàm tạo có tham số là bất kỳ Bản đồ nào. Ngoài ra, xin chúc mừng erickson (Tôi giả sử, vì bạn chỉ có 5 đại diện từ 10k). –

+0

Ding! erickson lên cấp. –

28

Bạn có một số tùy chọn. Liệt kê theo thứ tự ưu tiên:

  1. Sử dụng một SortedMap:
    SortedMap<whatever> myNewMap = new TreeMap<whatever>(myOldMap);
    Đây là bao la thích hợp hơn nếu bạn muốn lặp nhiều lần. Nó giữ các phím được sắp xếp để bạn không phải sắp xếp chúng trước khi lặp lại.
  2. Không có số 2.
  3. Không có # 3.
  4. SortedSet<whatever> keys = new TreeSet<whatever>(myMap.keySet());
  5. List<whatever> keys = new ArrayList<whatever>(myMap.keySet()); Collections.sort(keys);

cuối cùng hai sẽ giúp bạn có được những gì bạn muốn, nhưng chỉ nên được sử dụng nếu bạn chỉ muốn lặp một lần và sau đó quên toàn bộ điều.

+0

Trong bướC# 4, bạn cũng có thể tạo một TreeSet (một tập hợp được sắp xếp) thay vì một danh sách, giúp bạn tiết kiệm được một cuộc gọi rõ ràng để sắp xếp(). –

+0

@ David: Tôi đã nghĩ về điều đó, nhưng vì một lý do nào đó tôi quên rằng nó có thể lặp qua một Set. Nó đòi hỏi phải phân loại mỗi lần, mặc dù. –

+0

hmm tôi thích số 4. tại sao nó yêu cầu phân loại nhiều hơn số 1?tôi đã có thể nghĩ rằng nó là tốt như nhau –

8

Bạn có thể tạo bộ sưu tập được sắp xếp khi lặp lại nhưng có ý nghĩa hơn khi có bản đồ được sắp xếp ở vị trí đầu tiên. (Như đã được đề xuất)

Tất cả như nhau, dưới đây là cách bạn thực hiện.

Map<String, Object> map; 
for(String key: new TreeSet<String>(map.keySet()) { 
    // accessed in sorted order. 
} 
Các vấn đề liên quan