2012-01-16 26 views
6

Tôi cần một Bản đồ nhưng khi tôi nhận được (khóa, n), nó sẽ không chỉ trả về tất cả các bản ghi với giá trị khóa được tìm kiếm, mà còn tất cả các bit quan trọng cuối cùng của khóa giống với khóa tìm kiếm (ví dụ: áp dụng một cái gì đó như khóa & (1 < < (n + 1) -1)).Có bản đồ có độ dài khóa biến đổi trong thế giới Java không?

Có điều gì đó như thế này đã được triển khai trong Java không?

+0

Tại sao không chỉ thực hiện khóa thực tế chỉ là các bit ít quan trọng nhất của khóa được tính? –

+0

@GregS: Tôi tin rằng OP muốn 'n' được đưa ra trên bay, mỗi truy vấn. – amit

+0

Rõ ràng một cái gì đó cụ thể như thế này không có sẵn trong thư viện chuẩn. Câu hỏi đặt ra là: bạn không thể sử dụng n bit quan trọng cuối cùng làm khóa và danh sách làm giá trị? Tại sao chỉ định một khóa mà bạn thực sự không thể sử dụng? – Viruzzo

Trả lời

10

Không hoàn toàn, nhưng bạn có thể sử dụng NavigableMap.subMap để thực hiện việc này. ví dụ.

NavigableMap<Integer, Value> map = 
int keyBase = key & ~((1 << n)-1); 
Map<Integer, Value> subMap = map.subMap(keyBase, true, keyBase + (1 << n), false); 

Nếu bạn muốn tìm kiếm dựa trên bit thấp nhất thay vì bit cao nhất, bạn phải đảo ngược các bit trước khi thêm và tìm kiếm. Điều này sẽ nhóm lại với nhau bit thấp nhất, bit thấp thứ hai sau đó bit thứ ba thấp nhất, vv

+1

Tôi nghĩ rằng bạn cần phải đảo ngược các bit của khóa, bởi vì OP muốn giữ ít quan trọng nhất, không phải là bit quan trọng nhất. – dasblinkenlight

+0

Có, @dasblinkenlight. Có vẻ như đoạn mã trên chấp nhận các khóa có cùng bit '(64 - (n - 1))' * ngoài cùng bên trái * thay cho các bit 'n' * ngoài cùng bên phải *. – toto2

+0

Đã thêm nhận xét về cách sắp xếp theo bit thấp nhất trước tiên. –

2

HashMap sẽ không làm điều đó, nhưng TreeMap có thể.

Bạn sẽ cần phải chuẩn hóa và đảo ngược các phím của mình (ví dụ: quyết định số lượng bit bạn muốn giữ và đảo ngược các bit để làm cho các bit ít quan trọng trở thành quan trọng nhất). Sau đó, bạn có thể tách các bit ít quan trọng hơn (trước đây là các bit quan trọng nhất) khỏi các khóa của bạn và sử dụng các tìm kiếm phạm vi của bản đồ cây để tìm câu trả lời của bạn.

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