2012-06-08 29 views
8

Tôi muốn sử dụng loại hoạt động giống như danh sách các cặp đơn giản [(a,b)] làm từ điển, ánh xạ khóa loại a cho các giá trị loại b, trong khi vẫn duy trì "người dùng -specified ", thứ tự được xác định của các phím. (ví dụ như với các danh sách thông thường - Tôi muốn có thể "nối thêm" một mục mà sau đó được công nhận là "phần tử cuối cùng".) Tuy nhiên tôi muốn tra cứu truy cập ngẫu nhiên trên các khóa có hiệu suất tốt hơn tuyến tính, tức là Data.Map cung cấp. Một lựa chọn sẽ chỉ duy trì một bản đồ thông thường, thêm vào một danh sách các phím định nghĩa thứ tự của chúng:Loại từ điển có thứ tự khóa được xác định

data OrderedDict a b = OrderedDict (Map a b) [a] 

và sau đó xác định append hoạt động, vv mà giữ hai bộ sưu tập quan trọng trong việc đồng bộ hóa. Nó có vẻ xấu xí mặc dù để duy trì hai bộ sưu tập riêng biệt của cùng một phím. Có loại dữ liệu được tạo sẵn nào đã kết hợp các khóa đặt hàng với tra cứu truy cập ngẫu nhiên hiệu quả bằng khóa không?

+0

[LinkedHashMap] của Java (http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html) dường như làm một việc tương tự : chuỗi một danh sách các phím thông qua bản đồ. Lệnh OrderedDict của Python chỉ đơn giản là một danh sách các cặp, vì vậy chúng không có sự trợ giúp ở đây. –

+1

Bạn có ý nghĩa gì với "thứ tự được xác định"? Với hai khóa 'a1' và' a2', có phải là một ưu tiên được xác định liệu 'a1' có trước' a2' hoặc là độ ưu tiên được xác định khi chạy không? – Peter

+1

@peter Tôi có nghĩa là 'thứ tự xác định' theo nghĩa tương tự như với các danh sách thông thường - nếu tôi nối 'a2' sau khi gắn thêm' a1', thì 'a1' đứng trước' a2' – gcbenison

Trả lời

3

Trừ khi tôi hoàn toàn hiểu nhầm câu hỏi của bạn, Data.Map thực hiện chính xác việc này, bằng cách sử dụng trường hợp Ord loại khóa để đặt hàng. Vì nó là một cây nhị phân, việc thực hiện giữ các phím được đặt hàng là tốt.

Data.Map.keys cung cấp cho bạn các phím của bản đồ theo thứ tự tăng dần; như các biến đổi, chẳng hạn như map, của Bản đồ hoàn toàn có chức năng, thứ tự truyền tải không liên quan và tất cả các cách nhận chuỗi khóa hoặc cặp khóa/giá trị ngoài Bản đồ sẽ cung cấp cho bạn danh sách có thứ tự.

+9

Tôi tin gcbenison đang yêu cầu một cái gì đó như 'Dữ liệu .Map' nhưng với thuộc tính được thêm vào để bảo quản thứ tự mà các phím được chèn vào. – huon

+0

Nếu bạn có một loại khóa tùy chỉnh, bạn có thể có nó xác định thứ tự riêng của nó mặc dù. Mặc dù điều đó vẫn chỉ hoạt động nếu thứ tự có thể được tạo theo thủ tục. – Evi1M4chine

3

Nếu bạn chỉ muốn giữ một số cố định trật tự (ví dụ như thời gian chèn) ngoài của việc có O (log n) tra cứu/chèn, bạn chỉ có thể sử dụng nhiều bản đồ và cập nhật chúng cùng một lúc:

  1. Map a b để lưu trữ dữ liệu thực tế và
  2. Map Int a cung cấp cho bạn khóa thứ i theo thứ tự. (Nếu bạn cũng cần phải truy vấn các chỉ số của một chìa khóa đưa cho bạn có thể thêm một Map a Int)
4

Hãy xem ixset thư viện - nó cho phép bạn duy trì bộ lập chỉ mục theo nhiều cột (bằng a và bởi Int tại của bạn trường hợp). Điều này có thể duy trì được nhiều hơn việc giữ bản đồ phù hợp bằng tay

+0

Cảm ơn - 'ixset' thật tuyệt. Tôi không nghĩ rằng nó khá phù hợp với hóa đơn trong trường hợp này bởi vì nó có thể cho phép trạng thái không nhất quán (nhiều mục có cùng trường 'Int') và nó sẽ yêu cầu người gọi thực hiện thao tác' append' để chỉ rõ chỉ mục - cái gì đó không được yêu cầu bởi các danh sách thông thường. – gcbenison

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