Эквивалент C ++ map.lower_bound в Java - PullRequest
8 голосов
/ 07 марта 2012

Мой вопрос очень простой, но я сам не смог найти решение.

Я привык писать алгоритмы на C ++. Там я очень часто использую структуру std::map вместе со всеми вспомогательными методами, которые она предоставляет.

Этот метод возвращает итератор к первому элементу карты с ключом> = к ключу, указанному в качестве параметра. Пример:

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">

Круто то, что карта C ++ основана на красно-черных деревьях, поэтому запрос является логарифмическим (O(log n)).

Теперь мне нужно реализовать определенный алгоритм в Java. Мне нужна функциональность, подобная той, что я только что описал. Я знаю, что могу использовать TreeMap, который реализован в упорядоченном дереве. Однако я не нахожу эквивалента метода lower_bound. Есть ли такие?

Большое спасибо за вашу помощь.

Ответы [ 4 ]

7 голосов
/ 07 марта 2012

Я думаю, что вы ищете TreeMap . Посмотрите на способы работы сkeyKey / Entry.

1 голос
/ 16 января 2018

Это тестовый пример, показывающий поведение:

@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"));
}
1 голос
/ 07 марта 2012

Надеюсь, у вас это работает?

SortedMap tail = <Sorted Map Object>.tailMap(target);
if (!tail.isEmpty())
{
    upper = tail.firstKey();
}
0 голосов
/ 04 февраля 2018

вид аналога:

В C ++

vector   lower_bound  return the index

В Java

TreeSet  higher       return the Key
...