2011-03-08 15 views
70

Come recuperare un elemento da HashMap in base alla sua posizione, è possibile a tutti?È possibile ottenere l'elemento da HashMap dalla sua posizione?

+10

Cosa intendi per "posizione"? Le HashMaps non sono ordinate, quindi non hanno la solita nozione di "posizione" che si otterrebbe con qualcosa come un Vettore. – Mat

+0

Intende con il suo ordine di inserimento o altri ordini? –

+0

@Mark: ordine di inserzione. – Eugene

risposta

80

HashMaps non custodiamo ordinazione:

Questa classe non rilascia alcuna garanzia da l'ordine della mappa; in particolare, non garantisce che l'ordine rimanga costante nel tempo.

Dai uno sguardo allo LinkedHashMap, che garantisce un ordine di iterazione prevedibile.

+5

Questo in realtà non risponde alla domanda. Le altre risposte di seguito sono più utili. – forresthopkinsa

+4

Con riferimento, questo cita la documentazione che * direttamente * risponde alla domanda –

+0

Anche se l'ordine non è costante nel tempo, potrebbe comunque essere possibile recuperare uno dei membri per una determinata posizione. – Beginner

12

Uso LinkedHashMap:

tabella di hash e lista collegata implementazione dell'interfaccia Map, con ordine di iterazione prevedibile. Questa implementazione differisce da HashMap in quanto mantiene una lista doppiamente collegata che attraversa tutte le sue voci.

+20

che manterrà l'ordine, ma non è ancora possibile accedere agli elementi in base all'indice. Dovresti ripetere iterate – Bozho

+0

questo link è una vecchia versione dell'API. Vorrei suggerire il collegamento a un'API Java 6 o 7. – jzd

2

HashMap - e la struttura dati sottostante - tabelle hash, non hanno una nozione di posizione. A differenza di LinkedList o Vector, la chiave di input viene trasformata in un 'bucket' in cui è memorizzato il valore. Questi bucket non sono ordinati in un modo che ha senso al di fuori dell'interfaccia di HashMap e, in quanto tali, gli elementi inseriti in HashMap non sono in ordine, nel senso che ci si aspetterebbe con le altre strutture dati

2

HashMap non ha alcun concetto di posizione quindi non c'è modo di ottenere un oggetto in base alla posizione. Gli oggetti in Maps sono impostati e ottengono le chiavi.

2

Suppongo che per "posizione" ci si riferisca all'ordine in cui sono stati inseriti gli elementi in HashMap. In tal caso, si desidera utilizzare una LinkedHashMap. La LinkedHashMap non offre tuttavia un metodo di accesso; avrete bisogno di scrivere uno come

public Object getElementAt(LinkedHashMap map, int index) { 
    for (Map.Entry entry : map.entrySet()) { 
     if (index-- == 0) { 
      return entry.value(); 
     } 
    } 
    return null; 
} 
1

HashMaps non consentono l'accesso in base alla posizione, si conosce solo il codice hash e ed è possibile recuperare il valore se si può calcolare il codice hash della chiave. TreeMaps ha una nozione di ordine. Le mappe Linkedhas preservano l'ordine in cui sono state inserite nella mappa.

80

Utilizzare una LinkedHashMap e quando è necessario il recupero per posizione, convertire i valori in ArrayList.

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>(); 
/* Populate */ 
linkedHashMap.put("key0","value0"); 
linkedHashMap.put("key1","value1"); 
linkedHashMap.put("key2","value2"); 
/* Get by position */ 
int pos = 1; 
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos); 
+2

È sempre necessario istanziare una copia delle chiavi da HashMap ?? – Richard

6

Utilizzare LinkedHashMap e utilizzare questa funzione.

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>(); 

Definire in questo modo e.

private Entry getEntry(int id){ 
     Iterator iterator = map.entrySet().iterator(); 
     int n = 0; 
     while(iterator.hasNext()){ 
      Entry entry = (Entry) iterator.next(); 
      if(n == id){ 
       return entry; 
      } 
      n ++; 
     } 
     return null; 
    } 

La funzione può restituire la voce selezionata.

27

Se si desidera mantenere l'ordine in cui sono stati aggiunti gli elementi alla mappa, utilizzare LinkedHashMap anziché HashMap.

Ecco un approccio che permetterà di ottenere un valore dal suo indice nella mappa:

public Object getElementByIndex(LinkedHashMap map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} 
+0

In parole povere, devo dire ... Invece di convertire ogni cosa, stai usando solo il keyset. Superbo – kirtan403

0

Si può cercare di implementare qualcosa di simile, guarda:

Map<String, Integer> map = new LinkedHashMap<String, Integer>(); 
map.put("juan", 2); 
map.put("pedro", 3); 
map.put("pablo", 5); 
map.put("iphoncio",9) 

List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse 

System.out.println(indexes.indexOf("juan"));  // ==> 0 
System.out.println(indexes.indexOf("iphoncio"));  // ==> 3 

I spero che questo funzioni per te

1

Un altro approccio di lavoro è la trasformazione dei valori della mappa in una matrice e quindi il recupero dell'elemento all'indice. TEST DEL 100 000 elemento da ricerche di indice in LinkedHashMap di 100 000 oggetti utilizzando approcci seguenti ha portato alla seguenti risultati:

//My answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.values().toArray(new Particle[map.values().size()])[index]; 
} //68 965 ms 

//Syd Lambert's answer: 
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){ 
    return map.get((map.keySet().toArray())[ index ]); 
} //80 700 ms 

Tutto sommato elemento recupero da indice da LinkedHashMap sembra essere un'operazione piuttosto pesante.

7

Se, per qualche ragione, dovete attaccare con il HashMap, è possibile convertire il set di tasti per un array e indice le chiavi nella matrice per ottenere i valori nella mappa in questo modo:

Object[] keys = map.keySet().toArray(); 

È quindi possibile accedere alla mappa come:

map.get(keys[i]); 
+0

Nota che arr [i] dovrebbe essere cambiato in: keys [i] –

Problemi correlati