2011-08-09 28 views
5

Đây là mã của tôi để lưu trữ các dữ liệu vào HashMap và hiển thị dữ liệu sử dụng iteratorLàm thế nào để có được các yếu tố theo đúng thứ tự từ iterator()

public static void main(String args[]) { 
    HashMap<String, String> hm = new HashMap<String, String>(); 
    hm.put("aaa", "111"); 
    hm.put("bbb", "222"); 
    hm.put("ccc", "333"); 
    hm.put("ddd", "444"); 
    hm.put("eee", "555"); 
    hm.put("fff", "666"); 

    Iterator iterator = hm.keySet().iterator(); 

    while (iterator.hasNext()) { 
     String key = (String) iterator.next(); 
     String val = hm.get(key); 

     System.out.println(key + " " + val); 
    } 
} 

Nhưng nó không được hiển thị theo thứ tự mà tôi lưu trữ . Ai đó có thể cho tôi biết tôi đang đi sai ở đâu? Làm thế nào tôi có thể nhận được các yếu tố theo thứ tự?

Trả lời

22

Một HashMap không có trật tự được bảo đảm:

Lớp này không đảm bảo như trình tự của bản đồ;

Sử dụng LinkedHashMap.

Bảng băm và danh sách liên kết triển khai giao diện Bản đồ, với thứ tự lặp lại có thể dự đoán được.

6

Bạn cần sử dụng LinkedHashMap vì nó duy trì thứ tự các mục nhập của nó, không giống như HashMap.

Từ javadocs:

... thực hiện của giao diện Map với trật tự thể dự đoán được lặp. Việc triển khai này khác với HashMap ở chỗ nó duy trì danh sách được liên kết kép được chạy qua tất cả các mục nhập của nó . Danh sách liên kết này xác định thứ tự lặp lại, trong đó thường là thứ tự mà các phím được chèn vào bản đồ (thứ tự chèn).

+0

Cảm ơn bạn rất nhiều. Bây giờ vấn đề của tôi đã được giải quyết – Santhosh

2

HashMap không giữ trật tự trong đó chúng tôi đưa dữ liệu vào đó. Do đó, bạn có thể theo LinkedHashMap thay thế. Nó giữ thứ tự mà chúng tôi đặt dữ liệu.LinkedHashMap có thể được sử dụng giống như HashMap.

Map<key,value> map=new LinkedHashMap<key,value>(); 
map.put("key","value"); 
map.put("key","value"); 
map.put("key","value"); 

// tương tự bạn cũng có thể sử dụng trình lặp để truy cập dữ liệu. Nó sẽ hiển thị dfata theo thứ tự bạn thêm vào.

+0

-1, câu trả lời trùng lặp. – mre

+0

trùng lặp ??? tôi không bao giờ sao chép một lần câu trả lời. Những gì tôi biết tôi đã đăng. Điều đó không có nghĩa là những gì tôi biết không ai biết? Suy nghĩ trước khi đưa ra dấu âm. –

+0

Nhìn vào các câu trả lời do người khác cung cấp. Họ đã giải thích rằng 'HashMap' không giữ trật tự, và đề nghị sử dụng' LinkedHashMap' như một sự thay thế. Câu trả lời của bạn không cung cấp gì hơn những gì đã được cung cấp. Nó thực sự cung cấp ít hơn, vì bạn thậm chí không liên kết đến javadocs. Tôi đã bỏ phiếu xuống một số suy nghĩ, và tôi thậm chí còn đảm bảo rằng tôi đã không làm điều đó nặc danh - bạn được chào đón. – mre

0

Lý do là HashMap và HashSet không đảm bảo thứ tự của các giá trị được lưu trữ. Vị trí của các phần tử sẽ phụ thuộc vào kích thước của bảng nội bộ và mã băm của khóa.

Nếu bạn muốn tải dữ liệu của mình theo một số thứ tự, bạn cần phải sắp xếp các khóa hoặc giá trị. Ví dụ bạn có thể đặt các bộ sưu tập của các mục nhập (Map.entrySet()) vào danh sách và sắp xếp theo bất kỳ tiêu chí nào bạn muốn. Hoặc bạn có thể sử dụng SortedMap (TreeMap chẳng hạn) để lưu trữ các đối tượng của bạn.

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