2011-10-31 29 views
7

Tôi cần một bộ sưu tập khóa/giá trị delphi sẽ cho phép tôi lặp qua bộ sưu tập theo cùng thứ tự các cặp khóa/giá trị được chèn/thêm vào.Bộ sưu tập khóa/giá trị duy trì thứ tự

TList<T> đảm bảo đơn đặt hàng nhưng TDictionary<T1, T2> thì không.

Tôi đoán tôi luôn có thể xác định TList<TPair<Key, Value>> nhưng sẽ phức tạp hơn khi làm việc cùng.

Có loại bộ sưu tập được tích hợp sẵn có đáp ứng các yêu cầu của tôi hoặc sẽ gói TList<TPair<Key, Value>> làm lựa chọn tốt nhất của tôi không? Hoặc có lẽ sẽ tốt hơn nếu có một số TList<Key>TDictionary<Key, Value> và lặp qua danh sách.

+0

Không có từ điển được đặt hàng sẵn. Tôi hy vọng có sự triển khai của bên thứ ba xung quanh, nhưng cá nhân tôi không biết một. –

+0

Một 'TList >' được sắp xếp trên Khóa không phải là quá xấu, bởi vì một hoạt động tìm Key có thể sử dụng tìm kiếm nhị phân, nhưng cấu trúc dữ liệu dựa trên 'cây' có lẽ là những gì bạn cần. Lưu ý rằng 'TList >' sẽ không thực thi tính duy nhất, đó là điều mà bạn cũng có thể muốn triển khai, nếu bạn muốn thực thi các khóa duy nhất. –

Trả lời

3

Nếu loại khóa của bạn là string và loại giá trị của bạn là hậu duệ của TObject, hãy sử dụng TStringList. Lưu trữ các giá trị của bạn trong thuộc tính mảng Objects.

SL.AddObject('foo', obj1); 

SL.Add('bar'); 
i := SL.IndexOf('bar'); 
SL.Objects[i] := obj2; 

Đặt thuộc tính OwnsObjects nếu bạn cần.

3

số DeHL collections library chứa nhiều từ khóa giống như "Từ điển được đặt hàng". Những cái được đặt hàng sử dụng cây (có thứ tự) thay vì bản đồ băm không có thứ tự.

Tôi tin rằng TSortedDistinctMultiMap có thể là những gì bạn cần, nếu bạn muốn thực thi độc đáo, và nếu bạn không muốn thực thi Key giá trị độc đáo, sau đó có sự lựa chọn khác (không Distinct trong tên lớp) sẽ được gần với những gì bạn cần.

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