2012-03-07 15 views
6

Mi pregunta es muy básica, pero no pude encontrar la solución yo mismo.Equivalente de C++ map.lower_bound en Java

Estoy acostumbrado a escribir algoritmos en C++. A menudo utilizo la estructura std::map, junto con todos los métodos auxiliares que proporciona.

Este método devuelve el iterador al primer elemento del mapa con la tecla> = en la clave dada como parámetro. Ejemplo:

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

Lo interesante es que el mapa C++ se basa en árboles rojo-negro y así la consulta es logarítmica (O(log n)).

Ahora tengo que implementar un cierto algoritmo en Java. Necesito una funcionalidad similar a la que acabo de describir. Sé que puedo usar TreeMap que se implementa en el árbol ordenado. Sin embargo, no parece encontrar el equivalente del método lower_bound. ¿Hay tal?

Muchas gracias por su ayuda.

Respuesta

6

Supongo que usted está buscando TreeMap. Eche un vistazo a los métodos ceilingKey/Entry.

+0

Gracias debería haber mirado con más cuidado, pero de alguna manera pensé que debería ser un método declarado directamente en 'TreeMap'. –

+1

Creo que el método 'ceilingEntry' es un equivalente exacto de' std :: lower_bound', mientras que 'lowEntry' es muy similar pero aún diferente. – stgatilov

+0

Creo que tienes razón, voy a editar mi respuesta. –

1

Espero que esto funcione para usted?

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

Esto parece más en recursos consumir y más difícil de usar que la sugerencia de @Nikola –

+0

En realidad resultó que usted fue quien realmente me ayudó, porque estoy desarrollando para Android y el método mencionado anteriormente ('lowerEntry') no está disponible allí. –

0

Este es un caso de prueba que muestra el comportamiento:

@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

¿En qué sentido te refieres a que su sugerencia no está funcionando correctamente? Creo que él sugiere exactamente lo mismo que tú. –

+0

la sugerencia es usar ceilingkey. floorKey es el derecho de uso. – Alex

+1

Creo que se equivoca al entender cómo funciona 'lower_bound' en C++. En realidad, obtiene la primera clave que es> = de la clave dada. –

0

un poco similar:

En C++

vector lower_bound return the index 

En Java

TreeSet higher  return the Key