2012-06-22 11 views
14

Ho una TreeMap con un set di coppie "Chiave e valore". Come posso ottenere sia la chiave che il valore in un particolare indice della TreeMap?Come ottenere la chiave e il valore di una TreeMap su un indice particolare

MODIFICA: @ TO-ALL: Grazie. Ma so come implementarlo usando un ArrayList extra. Ho solo pensato che ci fosse un modo per ottenere ciò senza usare un ArrayList extra.

+2

Perché vuoi farlo? Gli indici sono interni all'implementazione TreeMap. Non dovresti usarli. Dovresti sempre fare affidamento solo sui metodi 'keys()', 'values ​​()' e 'get (chiave)'. –

+1

È abbastanza deliberato che non è possibile farlo, eccetto per il semplice iterare attraverso il 'entrySet' in tempo lineare. –

+0

Sto sviluppando un'applicazione musicale e devo memorizzare albumname in chiave e albumid in valore. La situazione è così per me per ottenere sia la chiave che il valore. Posso raggiungere il mio compito usando un ArrayList extra, ma voglio implementarlo semplicemente. –

risposta

2

Questo potrebbe non essere il modo migliore, ma sarà possibile accedere alla chiave/valore a un indice particolare.

TreeMap<Object, Object> foo = new TreeMap<Object, Object>(); 
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX]; 
Object value = foo.get(key); 
19

Se davvero si vuole utilizzare TreeMap e ottenere in base alla posizione, è possibile utilizzare il seguente:

key => treemap.keySet().toArray()[0] 
value => treemap.get(key); 

OR (se si desidera solo valore)

treemap.values().toArray()[0]; 

ma vorrei suggerisci di usare iteratore, come nel metodo sopra, ha bisogno di creare array ogni volta che vuoi trovarlo (quindi non così efficiente) e dovresti fare anche attenzione a fare in modo che l'indice non diventi irraggiungibile.

+0

Creo questo array solo una volta all'avvio, quindi lo mantieni come tabella di ricerca.Inoltre, ecco un esempio per ottenere un array tipizzato 'myMap.keySet(). ToArray (new Integer [0]);' Grazie! – gnB

3

È possibile copiare set di voce in una lista di array e quindi ottenere voce desiderata in base all'indice:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet()); 
Map.Entry<K,V>=list.get(index); 

Ma a) la copia prende O (n) e b) in caso di modifiche TreeMap, la lista più validi.

5

Prima di tutto, non sono sicuro del motivo per cui le persone qui si occupano così frequentemente della validità di una domanda. Esistono numerosi casi in cui le persone hanno ritenuto opportuno mantenere un ArrayList in ordine. Mantenere un ArrayList nell'ordine ordinato è grossolanamente inefficiente per gli elenchi di grandi dimensioni.

I nodi Entry della distribuzione di origine Java (Oracle) standard non mantengono le dimensioni degli alberi discendenti. Per questo motivo, non è possibile identificare un elemento all'interno della mappa per indice senza una ricerca sequenziale inefficiente.

Trovo questo inconveniente così grave che ho scritto la mia mappa AVL in grado di ottenere in modo efficiente elementi per indice e calcolo indexOf (E). Rendere ciò possibile è semplice come mantenere le dimensioni di ciascuno dei rami sinistro e destro di una voce. C'è qualche possibilità che la libreria Glazedlists abbia un albero ricercabile incorporato in qualche parte. Potresti rivederlo.

-2

qui è un'altra opzione per ottenere la chiave da un valore:

Map<String, String> map = new HashMap<String, String>(); 
map.put("s1", "s1Val"); 
map.put("s2", "s2Val"); 
map.put("s3", "s3Val"); 

    // ex: "s2Val" -> return "s2" 

int index = new ArrayList<String>(map.values()).indexOf("s2Val"); 
System.out.println(map.keySet().toArray()[index]); // -> return "s2" 
+0

non correlato alla domanda OP richiesta. Inoltre, 'Mappa' non garantisce l'ordine – frugalcoder

0

Questo potrebbe essere utile

TreeMap< String,Integer > ht=new TreeMap<>(); 

ht.put("12",1); 
ht.put("22",2); 
ht.put("32",3); 
ht.put("42",4); 
for(int i=0;i<ht.size();i++) 
{ 
    System.out.println(new Vector(ht.keySet()).get(i)); 
    System.out.println(new Vector(ht.values()).get(i)); 
} 
Problemi correlati