Tôi bối rối rằng tôi không thể tìm ra câu trả lời nhanh chóng cho điều này. Về cơ bản, tôi đang tìm kiếm một cấu trúc dữ liệu trong Java để triển khai java.util.List
giao diện, nhưng nó lưu trữ các thành viên của nó theo thứ tự được sắp xếp. Tôi biết rằng bạn có thể sử dụng bình thường ArrayList
và sử dụngCollections.sort()
trên nó, nhưng tôi có một tình huống là thỉnh thoảng tôi thêm và thường truy xuất các thành viên từ danh sách của mình và tôi không muốn phải sắp xếp nó mỗi khi tôi truy xuất một thành viên trong trường hợp cái mới đã được thêm vào. Bất cứ ai có thể chỉ cho tôi về một thứ tồn tại trong JDK hoặc thậm chí các thư viện của bên thứ ba?
BIÊN TẬP : Cơ cấu dữ liệu sẽ cần giữ lại các bản sao.
TRẢ LỜI TÓM TẮT : Tôi thấy tất cả những điều này rất thú vị và đã học được rất nhiều. Aioobe nói riêng đáng được nhắc đến vì sự kiên trì của anh ấy trong việc cố gắng đạt được các yêu cầu của tôi ở trên (chủ yếu là triển khai java.util.List được sắp xếp hỗ trợ các bản sao). Tôi đã chấp nhận câu trả lời của anh ấy là chính xác nhất cho những gì tôi đã hỏi và hầu hết đều cho rằng gợi lên ý nghĩa của những gì tôi đang tìm kiếm ngay cả khi những gì tôi hỏi không phải là những gì tôi cần.
Vấn đề với những gì tôi yêu cầu nằm ở chính giao diện Danh sách và khái niệm về các phương thức tùy chọn trong một giao diện. Để trích dẫn javadoc:
Người dùng giao diện này có quyền kiểm soát chính xác vị trí mà mỗi phần tử được chèn trong danh sách.
Việc chèn vào danh sách đã sắp xếp không có quyền kiểm soát chính xác điểm chèn. Sau đó, bạn phải nghĩ cách bạn sẽ xử lý một số phương pháp. Lấy add
ví dụ:
public boolean add (Object o)
Appends the specified element to the end of this list (optional operation).
Bây giờ bạn đang ở trong tình huống không thoải mái của một trong hai) Phá vỡ hợp đồng và thực hiện một phiên bản được sắp xếp của phần bổ sung 2) Để add
thêm một phần tử vào cuối danh sách, phá vỡ thứ tự đã sắp xếp của bạn 3) Bỏ add
đi (tùy chọn) bằng cách ném một UnsupportedOperationException
và thực hiện một phương pháp mà thêm mặt hàng theo một thứ tự sắp xếp.
Tùy chọn 3 có lẽ là tốt nhất, nhưng tôi thấy không có lợi khi có một phương thức thêm mà bạn không thể sử dụng và một phương thức Đã phân loại khác không có trong giao diện.
Các giải pháp liên quan khác (không theo thứ tự cụ thể):
- java.util.PutorQueue có lẽ gần với những gì tôi cần hơn những gì tôi yêu cầu. Hàng đợi không phải là định nghĩa chính xác nhất về tập hợp các đối tượng trong trường hợp của tôi, nhưng về mặt chức năng, nó thực hiện mọi thứ tôi cần.
- net.sourceforge.nite.util.SortedList . Tuy nhiên, việc triển khai này phá vỡ hợp đồng của giao diện Danh sách bằng cách thực hiện sắp xếp trong
add(Object obj)
phương thức và kỳ lạ là không có phương pháp nào có hiệu lựcadd(int index, Object obj)
. Sự đồng thuận chung cho thấythrow new UnsupportedOperationException()
có thể là một lựa chọn tốt hơn trong kịch bản này. - Guava's TreeMultiSet Một triển khai bộ hỗ trợ các bản sao
- ca.odell.glazedlists.SortedList Lớp này có thông báo trước trong javadoc của nó:
Warning: This class breaks the contract required by List