Come recuperare un elemento da HashMap in base alla sua posizione, è possibile a tutti?È possibile ottenere l'elemento da HashMap dalla sua posizione?
risposta
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.
Questo in realtà non risponde alla domanda. Le altre risposte di seguito sono più utili. – forresthopkinsa
Con riferimento, questo cita la documentazione che * direttamente * risponde alla domanda –
Anche se l'ordine non è costante nel tempo, potrebbe comunque essere possibile recuperare uno dei membri per una determinata posizione. – Beginner
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.
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
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.
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;
}
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.
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);
È sempre necessario istanziare una copia delle chiavi da HashMap ?? – Richard
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.
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 ]);
}
In parole povere, devo dire ... Invece di convertire ogni cosa, stai usando solo il keyset. Superbo – kirtan403
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
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.
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]);
Nota che arr [i] dovrebbe essere cambiato in: keys [i] –
- 1. Come ottenere la posizione chiave da una HashMap in Java
- 2. Impossibile trascinare UITableViewCell dalla sua posizione corrente durante il riordino
- 3. È possibile ottenere il nome utente dalla riga di comando
- 4. È possibile rinominare una chiave Hashmap?
- 5. Ottenere chiave dal HashMap in android da posizione o di un indice
- 6. Eccezione OutOfMemory da BinaryFormatter.Deserialize proveniente dalla sua chiamata StringBuilder interna
- 7. UIView cambiando la sua posizione in swift
- 8. HashMap ottenere restituisce null
- 9. AngularJS ngInclude dinamicamente cambia la sua posizione
- 10. È possibile ottenere "tutto" da javax.naming.InitialContext?
- 11. Codice postale dalla posizione
- 12. È possibile definire un'interfaccia di servizio jax-rs separata dalla sua implementazione (con eclissi e jersey)?
- 13. Come ottenere la posizione UITouch da UIGestureRecognizer
- 14. come ottenere i valori hash dalla posizione in ruby?
- 15. ottenere la posizione corrente da un XmlReader
- 16. Come ottenere timestamp accurati dalla posizione GPS Android
- 17. Come sapere/ottenere la capacità di hashmap?
- 18. È possibile creare una coda per il set HashMap?
- 19. EL ottenere il valore di un HashMap da Integer chiave
- 20. Appena installato SASS, ma non è possibile ottenere la sua versione
- 21. Accesso valore hashmap dalla variabile in JSP
- 22. AutoCompleteTextView onItemClick posizione dell'elemento o id utilizzando HashMap
- 23. è possibile uscire dalla chiusura nel fantastico
- 24. Valore mutabile predefinito da HashMap
- 25. Get indice spirale dalla posizione
- 26. come ottenere un elenco di tutte le costanti che è possibile ottenere dalla console di rotaie
- 27. È possibile leggere dalla console in Dart?
- 28. non è possibile ottenere l'ID editore da http://www.admob.com
- 29. Nginx: è possibile ottenere la risposta riattivata da auth_request
- 30. È possibile ottenere un IntPtr da un array int []?
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
Intende con il suo ordine di inserimento o altri ordini? –
@Mark: ordine di inserzione. – Eugene