2016-02-25 17 views
5

Trong Java, TreeMap<K,V> sử dụng cây RB để lưu trữ các mục nhập, cho phép lặp lại theo thứ tự sử dụng map.entrySet().iterator(), đồng thời đảm bảo chèn và tra cứu trong thời gian nhật ký (N).Java: trình lặp từ mục nhập TreeMap?

TreeMap cũng cung cấp các phương pháp để tìm giới hạn trên và dưới cho một khóa nhất định: map.floorEntry(k), map.ceilingEntry(), map.lowerEntry(k)map.higherEntry(). Tuy nhiên, giá trị trả lại của một trường hợp là một cá thể Map.Entry<K,V> và sẽ không trực tiếp cho phép một người truy cập vào các mục nhập lân cận. Tôi muốn thăm những người hàng xóm của một mục nhập giả định cho chìa khóa của nó.

Có cách nào để có được một trình lặp từ một mục nhập TreeMap hoặc làm những gì tôi đang cố gắng làm không?

Là quen với std::map<K,V> lớp C++ 's, tôi đang ở một mất mát ở đây ...

LƯU Ý Tôi mở cửa cho một giải pháp sử dụng một thư viện chứa khác hơn java.util như miễn là nó có một thùng chứa bản đồ được sắp xếp với một số đảm bảo phức tạp về thời gian hợp lý.

Trả lời

2

Bạn có thể lấy khóa trả về Map.Entry<K, V> làm thông số trong tailMap(K fromKey) hoặc headMap(K toKey) và lặp lại kết quả.

+0

Đó gần như những gì tôi đang tìm kiếm; tuy nhiên, xem xét rằng tôi muốn nhận được cả hai mục ngay lập tức trước và ngay sau khi một khóa nhất định, tôi sẽ phải gọi cả hai phương pháp, có nghĩa là hai tra cứu, mà có vẻ như một sự lãng phí chu kỳ CPU. – Shadocko

+0

OK, xin lỗi tôi hiểu lầm câu trả lời của bạn, bạn rõ ràng có nghĩa là 'map.tailMap (map.lowerEntry (k) .getKey())'. Điều đó sẽ hoạt động nhưng vẫn yêu cầu 2 lần tra cứu. – Shadocko

+0

Một giải pháp khác - tạo trình lặp của TreeMap cho nhu cầu của bạn, nhưng nó không phải là một nhiệm vụ dễ dàng – Eva

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