2012-03-07 13 views
6

La mia domanda è molto semplice, ma non sono riuscito a trovare la soluzione da solo.Equivalente di C++ map.lower_bound in Java

Sono abituato a scrivere algoritmi in C++. Lì utilizzo molto spesso la struttura std::map, insieme a tutti i metodi ausiliari che fornisce.

Questo metodo restituisce iteratore al primo elemento della mappa con chiave> = alla chiave fornita come parametro. Esempio:

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

La cosa interessante è che la mappa C++ si basa su alberi rosso-nero e così la query è logaritmica (O(log n)).

Ora ho bisogno di implementare un determinato algoritmo in Java. Ho bisogno di funzionalità simili a quella che ho appena descritto. So che posso usare TreeMap che è implementato nell'albero ordinato. Tuttavia, non riesco a trovare l'equivalente del metodo lower_bound. Esiste?

Grazie mille per il vostro aiuto.

risposta

6

Immagino che stiate cercando TreeMap. Dai un'occhiata ai metodi ceilingKey/Entry.

+0

Grazie avrei dovuto guardare più attentamente, ma in qualche modo ho pensato che dovrebbe essere un metodo dichiarato direttamente in 'TreeMap'. –

+1

Penso che il metodo 'ceilingEntry' sia un equivalente esatto di' std :: lower_bound', mentre 'lowerEntry' è molto simile ma ancora diverso. – stgatilov

+0

Penso che tu abbia ragione, modificherò la mia risposta. –

1

Spero che questo funzioni per voi?

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

Questo sembra più profilo delle risorse consumare e più difficile da usare rispetto al suggerimento di @ Nikola –

+0

In realtà si è scoperto che tu eri quello che effettivamente mi aiuti, perché sto sviluppando per Android e il metodo sopra menzionato ('lowerEntry') non è disponibile lì. –

0

Questo è un test che mostra un comportamento:

@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

In che senso intendi che il suo suggerimento non funziona correttamente? Penso che suggerisca esattamente la stessa cosa che hai fatto tu. –

+0

il suggerimento è di usare ceilingkey. floorKey è il diritto di usare. – Alex

+1

Penso che tu abbia torto nella comprensione di come 'lower_bound' funzioni in C++. In realtà recupera la prima chiave che è> = della chiave data. –

0

natura simile:

In C++

vector lower_bound return the index 

In Java

TreeSet higher  return the Key