2009-09-14 28 views
19

Tôi có một hashtable. phương thức values ​​() trả về các giá trị theo một trật tự nào đó khác với thứ tự mà tôi được chèn vào. Làm thế nào tôi có thể nhận được các giá trị theo cùng thứ tự như tôi đã chèn? Sử dụng LinkedHashmap là một phương án thay thế nhưng nó không được đồng bộ hóa.Làm thế nào để giữ trật tự của các phần tử trong Hashtable

+0

Những ngôn ngữ bạn đang sử dụng? –

+0

LinkedHashMap là một phần của Java. – jimyi

+0

Tôi đang sử dụng Java. JDK1.6 –

Trả lời

31

Sử dụng số LinkedHashMap.

bảng Hash và danh sách liên kết thực hiện của giao diện Map, với trật tự lặp dự đoán được. Triển khai này khác với HashMap trong rằng nó duy trì danh sách được liên kết hai lần chạy qua tất cả các mục nhập của nó. Danh sách được liên kết này xác định thứ tự lặp lại , thường là thứ tự trong đó khóa được chèn vào bản đồ (thứ tự chèn). Lưu ý rằng thứ tự chèn không bị ảnh hưởng nếu khóa được chèn lại vào bản đồ. (A k quan trọng là reinserted vào một m bản đồ nếu m.put(k, v) được gọi khi m.containsKey(k) sẽ trở true ngay lập tức trước khi gọi.)

kết hợp với Collections.synchronizedMap().

Vì vậy, ví dụ:

Map<String, String> map = Collections.synchronizedMap(
    new LinkedHashMap<String, String>()); 
+0

Để làm rõ: Nếu tôi không xem xét có nhiều hơn thì 1 lần truy cập vào 'LinkedHashMap' này tại một thời điểm, nó vẫn được khuyến khích để đồng bộ hóa nó? Hoặc 'LinkedHashMap' trên chính nó sẽ được coi là đủ? – blo0p3r

+1

@ blo0p3r Bản đồ 'LinedHashMap 'phải đủ độc lập. –

1

Bảng băm vốn không có thứ tự, vì vậy bạn đang sử dụng cấu trúc dữ liệu sai. Vì bạn không chỉ định ngôn ngữ bạn đang sử dụng, tôi không thể đề xuất một ngôn ngữ thay thế, nhưng bạn cần một số loại khóa/giá trị đặt hàng.

+0

tôi đang sử dụng Java. JDK1.6 –

2

Tôi khá chắc chắn rằng các hashtables lý do là không được phân loại là để hỗ trợ lưu trữ và tốc độ phục hồi. Bởi vì điều này tôi sẽ đề nghị sử dụng một cấu trúc bên ngoài để duy trì trật tự và chỉ sử dụng hashtable để lưu trữ các giá trị (để tra cứu nhanh).

4

Bạn có thể có thể quấn một LinkedHashMap và đồng bộ hóa hoặc bạn có thể sử dụng tiện ích Collections.synchronizedMap để tạo ra một đồng bộ LinkedHashMap:

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

Từ javadoc:

Nếu nhiều đề truy cập vào một bản đồ liên kết băm đồng thời, và ít nhất một trong các chủ đề sửa đổi bản đồ theo cấu trúc, nó phải được đồng bộ hóa bên ngoài. Điều này thường được thực hiện bằng cách đồng bộ hóa trên một số đối tượng tự nhiên đóng gói bản đồ. Nếu không có đối tượng như vậy tồn tại, bản đồ sẽ được "gói" bằng cách sử dụng phương thức Collections.synchronizedMap. Điều này được thực hiện tốt nhất vào thời điểm tạo, để ngăn truy cập không đồng bộ ngẫu nhiên vào bản đồ

+0

cảm ơn rất nhiều .. nhưng nó sẽ là một hit hiệu suất? –

+0

Chi phí thực hiện sẽ không thể bỏ qua (theo nghĩa đen là nano giây). – Adamski

1

Nếu jdk1.6 bạn chỉ có hai loại bản đồ được đặt hàng EnumMap và LinkedHashMap. Cả hai đều không được đồng bộ hóa.Nếu bạn chỉ cần nhớ thứ tự, sử dụng

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

nếu bạn muốn sắp xếp sau đó sử dụng ConcurrentSkipListMap

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