2012-03-07 80 views
6

Câu hỏi của tôi rất cơ bản, nhưng tôi không thể tự tìm ra giải pháp.Tương đương với C++ map.lower_bound trong Java

Tôi đã quen với việc viết các thuật toán trong C++. Ở đó tôi thường sử dụng cấu trúc std::map, cùng với tất cả các phương thức phụ trợ mà nó cung cấp.

Phương thức này trả về trình vòng lặp cho phần tử đầu tiên của bản đồ bằng khóa> = đến khóa được cho làm tham số. Ví dụ:

map<int, string> m; 
// m = { 4 => "foo", 6 => "bar", 10 => "abracadabra" } 
m.lower_bound(2); // returns iterator pointing to <4, "foo"> 
m.lower_bound(4); // returns iterator pointing to <4, "foo"> 
m.lower_bound(5); // returns iterator pointing to <6, "bar"> 

Điều thú vị là bản đồ C++ dựa trên cây đỏ đen và do đó truy vấn là logarit (O(log n)).

Bây giờ tôi cần triển khai một thuật toán nhất định trong Java. Tôi cần chức năng tương tự như chức năng tôi vừa mô tả. Tôi biết tôi có thể sử dụng TreeMap được triển khai trong cây có thứ tự. Tuy nhiên tôi dường như không tìm thấy tương đương với phương thức lower_bound. Có cái đó không?

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

Trả lời

6

Tôi đoán bạn đang tìm kiếm TreeMap. Hãy xem xét các phương pháp trần/nhập.

+0

Cảm ơn tôi đã xem xét cẩn thận hơn, nhưng tôi bằng cách nào đó nghĩ rằng nó phải là một phương pháp được khai báo trực tiếp trong 'TreeMap'. –

+1

Tôi nghĩ phương thức 'ceilingEntry' tương đương chính xác' std :: lower_bound', trong khi 'lowerEntry' rất giống nhưng vẫn khác. – stgatilov

+0

Tôi nghĩ bạn nói đúng, tôi sẽ chỉnh sửa câu trả lời của tôi. –

1

Tôi hy vọng điều này phù hợp với bạn?

SortedMap tail = <Sorted Map Object>.tailMap(target); 
if (!tail.isEmpty()) 
{ 
    upper = tail.firstKey(); 
} 
+0

Điều này có vẻ thốn hơn tiêu thụ và khó sử dụng hơn đề xuất @Nikola –

+0

Trên thực tế nó bật ra bạn là một trong những thực sự giúp tôi, bởi vì tôi đang phát triển cho Android và phương pháp được đề cập ở trên ('lowerEntry') là không có sẵn ở đó. –

0

Đây là một trường hợp thử nghiệm cho thấy hành vi:

@Test 
public void testPrefixMatch() { 

    treeMap.put("1.2.3", "bar"); 
    treeMap.put("1.2.3.4", "bar"); 
    treeMap.put("1.2.3.5.6", "bar"); 


    assertEquals("1.2.3.5.6", treeMap.ceilingKey("1.2.3.4.5.6.7")); 
    assertEquals("1.2.3.4", treeMap.floorKey("1.2.3.4.8.6")); 
    assertEquals("1.2.3.5.6", treeMap.ceilingKey("1.2.3.4.8.6")); 
} 
+0

Trong ý nghĩa nào bạn có nghĩa là đề xuất của anh ấy không hoạt động chính xác? Tôi nghĩ anh ấy gợi ý chính xác giống như bạn đã làm. –

+0

đề xuất là sử dụng phím tắt. floorKey là quyền sử dụng. – Alex

+1

Tôi nghĩ bạn hiểu sai cách 'lower_bound' hoạt động trong C++. Nó thực sự tìm nạp khóa đầu tiên là> = của khóa đã cho. –

0

loại tương tự:

Trong C++

vector lower_bound return the index 

Trong Java

TreeSet higher  return the Key 
Các vấn đề liên quan