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
Trả lời
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ớiHashMap
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ếum.put(k, v)
được gọi khim.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>());
Để 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
@ blo0p3r Bản đồ 'LinedHashMap 'phải đủ độc lập. –
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.
tôi đang sử dụng Java. JDK1.6 –
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).
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 đồ
cảm ơn rất nhiều .. nhưng nó sẽ là một hit hiệu suất? –
Chi phí thực hiện sẽ không thể bỏ qua (theo nghĩa đen là nano giây). – Adamski
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
- 1. IOrderedEnumerable.Select() giữ nguyên thứ tự phần tử?
- 2. Liệu LINQ to Objects giữ gìn trật tự của nó
- 3. Interleaving nhiều iterables ngẫu nhiên trong khi vẫn giữ trật tự của chúng trong python
- 4. Làm thế nào để giữ một phần tử giả được cố định trong một phần tử được cuộn?
- 5. Xóa các phần tử trùng lặp khỏi danh sách Python có chứa các phần tử không thể khắc phục được trong khi vẫn giữ nguyên thứ tự?
- 6. Cách hiệu quả nhất để xóa các bản sao khỏi danh sách Python trong khi vẫn giữ trật tự và xóa phần tử cũ nhất
- 7. Thứ tự của các phần tử trong danh sách JSON có được giữ nguyên không?
- 8. Làm thế nào để hợp nhất hai mảng của các đối tượng JSON - loại bỏ các bản sao và giữ gìn trật tự trong Javascript/jQuery?
- 9. C++ bản đồ băm riêng giữ gìn trật tự chèn
- 10. Làm cách nào để thay thế phần tử của mảng?
- 11. Giữ lại trật tự trong khi sử dụng Python của bộ chênh lệch
- 12. Làm thế nào để ngẫu nhiên các phần tử enum?
- 13. Làm thế nào để tách (chunk) một mảng Ruby thành các phần của phần tử X?
- 14. Làm cách nào để cải thiện hiệu suất của một hashtable với 1 triệu thành phần và 997 nhóm?
- 15. Làm thế nào để giữ cho toán tử `roll` thẳng?
- 16. Làm thế nào để vẽ các phần tử con của Composite trong SWT?
- 17. R: Làm thế nào để thay thế các phần tử của một data.frame?
- 18. stack.ToList() trong .NET - thứ tự của các phần tử?
- 19. Làm thế nào để có được các phần tử n đầu tiên của một std :: map
- 20. BeautifulSoup: Làm cách nào để thay thế giá trị trong phần tử có thẻ phần tử?
- 21. Cách thay thế các phần tử trong mảng bằng các phần tử của mảng khác
- 22. Làm thế nào để chèn một phần tử mới vào giữa tất cả các phần tử của một mảng Ruby?
- 23. Làm thế nào để có được tất cả các phần tử con của cây phần tử với Python ElementTree?
- 24. Phần tử lược đồ tuần tự có đảm bảo thứ tự các phần tử con không?
- 25. Django: Làm thế nào để vô hiệu hóa trật tự trong mô hình
- 26. làm thế nào để xóa tất cả các phần tử trong bảng Lua?
- 27. XSD - làm cách nào để cho phép các phần tử theo bất kỳ thứ tự nào?
- 28. Làm cách nào để căn giữa các phần tử trong BoxLayout bằng cách sử dụng trung tâm của phần tử?
- 29. Thứ tự lược đồ XML của các phần tử
- 30. Làm thế nào để giữ các dấu phân cách của Regex.Split?
Những ngôn ngữ bạn đang sử dụng? –
LinkedHashMap là một phần của Java. – jimyi
Tôi đang sử dụng Java. JDK1.6 –