Tôi tự hỏi nếu có một đối tác với java.util.LinkedHashMap
trong .NET? (ví dụ: các phần tử được (lại) được sắp xếp tự động nếu tôi truy cập một phần tử. (boolean accessOrder)).LinkedHashMap in .NET
Trả lời
Một chút Googling dường như cho thấy rằng không có tích hợp sẵn C# cho LinkedHashMap, nhưng có một số tùy chọn của bên thứ ba có sẵn.
Liên kết của bạn bị hỏng. – user
Chỉ cần làm rõ một chút cho người đọc: LinkedHashMap chỉ hoạt động theo cách đó khi được xây dựng với một quá tải hàm dựng cụ thể. Thông thường các phần tử được duy trì theo thứ tự chèn. (Điều này hơi lạ với tôi, nhưng đừng bận tâm.)
Tôi không tin rằng có bất kỳ lớp học nào như vậy trong .NET. Nó sẽ không quá khó để xây dựng một, bằng cách sử dụng một danh sách liên kết của các yếu tố và một từ điển từ khóa đến nút danh sách liên kết. Sau đó, truy cập sẽ bao gồm tìm nạp nút danh sách được liên kết, di chuyển nút đó đến đầu và trả về giá trị.
Tôi muốn được hạnh phúc để thực hiện nó tối nay hoặc ngày mai nếu bạn muốn - (! Thử nghiệm đầy đủ một bộ sưu tập là một doanh nghiệp mất nhiều thời gian) mặc dù có lẽ không phải với đơn vị xét nghiệm đầy đủ, vv
Lớp học kỳ quặc như vậy (hoạt động khác nhau tùy thuộc vào ctor) hữu ích cho điều gì? – configurator
@configurator: Tối ưu hóa điển hình cho bảng băm: di chuyển phần tử được truy cập gần đây vào phần đầu của chuỗi; phần tử được truy cập thường xuyên hơn, nhanh hơn nó được tìm thấy. Đối với hành vi khác nhau tùy thuộc vào ctor, nghĩ về nó như đi qua một IComparer khác nhau để một SortedList. –
@Vojislav: Đây không phải là "tối ưu hóa điển hình". LinkedHashMap không di chuyển các mục vào đầu trong các thùng, nó chỉ ghi nhớ khi nào mỗi mục được sử dụng, và di chuyển mục nhập vào đầu danh sách 'các mục được sử dụng gần đây'. Điều này chỉ ảnh hưởng đến thứ tự lặp lại, không phải tốc độ tra cứu của các tìm kiếm tiếp theo. –
Dưới đây là một C# thực hiện tôi được tìm thấy trên một số forum:
Nó không có giấy tờ nhưng có một số thử nghiệm. Nó không phải là chung chung, tuy nhiên. Ít nhất đó là điều tôi đoán.
@Jon: Tôi cũng đánh giá cao nếu bạn có thể thực hiện nhanh chóng. Tôi tưởng tượng rằng một từ điển trên đầu trang của một LinkedList sẽ là tốt nhất, nhưng I hear có vấn đề thu gom rác với LinkedList làm chậm mọi thứ.
Vấn đề thu gom rác có thể được giải quyết với nhóm nút. Bạn sẽ cần tùy chỉnh danh sách liên kết đôi tùy chỉnh mặc dù. –
Tôi đã sử dụng System.Collections.Specialized.OrderedDictionary làm thay thế cho LinkedHashMap. Nó làm việc cho tôi. Có bất cứ điều gì tôi đang thiếu về OrderedDictionary (có, nó không phải chung chung, nhưng nó có sẵn với. Net 2 hoặc mới hơn)?
Dường như với tôi rằng OrderedDictionary khác với LinkedHashMap theo hai cách quan trọng. 1) Mục nhập LInkedHashMap di chuyển lên phía trước sau khi nó được đọc. Đó là thứ tự được xác định bởi cả việc chèn và lựa chọn (truy cập). 2) LinkedHashMap có phương thức nạp chồng removeEldestEntry. Cả hai tính năng này đều có giá trị nếu bạn muốn xây dựng bộ nhớ cache. –
Nhibernate có triển khai NHibernate.Util.LinkedHashMap.
Nếu bạn đã có nó trên mã của bạn, như tôi đã có, nó có thể có ích
Tôi muốn hiểu được logic trong đó chỉ đơn thuần là truy cập vào một yếu tố trong bộ sưu tập được coi là một sự sửa đổi, do đó gây ra tái đặt hàng . – Cerebrus
Tôi không quen thuộc với các lớp học trong câu hỏi, nhưng có lẽ để cho phép truy cập nhanh hơn vào các yếu tố truy cập nhiều nhất? –
Bạn có thể xem chi tiết về LinkedHashMap tại http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html Nó giải thích cách sử dụng và khi nào nó hữu ích (cache LRU). –