2015-03-11 11 views
10

ho:Ottenere chiave dal HashMap in android da posizione o di un indice

public static HashMap<String, String> CHILD_NAME_DOB = new HashMap<>(); 

Supponiamo i valori in CHILD_NAME_DOB sono:

<adam,15121990> 
<roy,01051995> 
<neha,05091992> 
<alisha,11051992> 

Sto cercando di prendere l'ultimo elemento chiave da CHILD_NAME_DOB. Cioè, voglio recuperare la chiave alisha dall'esempio sopra a String name temporaneo.

Anche io voglio sapere come recuperare i dati per indice.

Eg .: se int index = 2, voglio chiave "Neha" in String name

TIA.

Modifica: DateOfBirth valore (dati di valore in CHILD_NAME_DOB) è dinamico ed è sconosciuto. Quindi THIS LINK non è quello che voglio.

+0

'HashMaps' non ha indici. Forse quello che stai cercando è 'LinkedHashMap', anche se nessuno lo sa. – EJP

+0

@EJP, sì, il mio male. Penso, dovrei andare per 'LinkedHashMap'. – DancingMonkeyOnLaughingBuffalo

+0

Hey ragazzi, che ne dici se mi piace [questo] (http://stackoverflow.com/a/3422405/2798218). Usate un 'interator' ma dichiarate la' String key' e 'value' al di fuori' iterator'. In questo modo otterrò l'ultimo elemento chiave. – DancingMonkeyOnLaughingBuffalo

risposta

3

Grazie a @ Pentium10 per this answer. E l'ho modificato in base alle mie esigenze.

String key="default"; 
Iterator myVeryOwnIterator = CHILD_NAME_DOB.keySet().iterator(); 
while(myVeryOwnIterator.hasNext()) { 
    key=(String)myVeryOwnIterator.next(); 
    //String value=(String)meMap.get(key); 
    } 
Toast.makeText(viewEnterChildExp.getContext(), "Key: "+key , Toast.LENGTH_LONG).show(); 

Sto ottenendo l'ultimo elemento chiave di questo.

Aggiornerò appena riesco anche a trovare un modo semplice per digitare l'indice.

+1

Questo * non * funziona in modo affidabile per HashMap. Devi usare LinkedHashMap come ho indicato nella mia risposta. – aioobe

+0

All'inizio 'HashMap' ha funzionato. Ma in seguito, dopo alcuni test casuali, ha restituito risultati inaspettati. Poi ho provato 'LinkedHashMap' e ha funzionato bene anche con i miei test casuali. Alla fine, sono andato su 'LinkedHashMap'. Grazie @aioobe. – DancingMonkeyOnLaughingBuffalo

+0

Stai per caso usando Java 8? – aioobe

1

Il recupero della chiave "last" e il recupero per indice non sono supportati da HashMap. È possibile utilizzare uno LinkedHashMap e cercare l'elemento con indice 2 (o l'ultimo elemento) ripetendolo su di esso. Ma questa sarà un'operazione O (n).

Ti suggerisco di utilizzare List<Pair<String, String>> se l'ordine delle chiavi/valori è importante per te e desideri effettuare la ricerca basata su indice.

Se entrambi ricerca basato chiave e indice basato è importante per voi, è possibile utilizzare una struttura di dati combinato che è composto da un List e HashMap, ma nota che la rimozione di elementi sarà O(n).

+0

hmm. Forse hai ragione. Lemme anche aspettare e vedere altre risposte – DancingMonkeyOnLaughingBuffalo

1

È possibile creare una classe figlia

public class Child(){ 
private String name; 
private String number; 

.... 

} 

e poi mettere l'oggetto in un elenco

public static List<Child> CHILD_NAME_DOB = new ArrayList<Child>(); // using LinkedList would defeat the purpose 

in questo modo è possibile richiamare il metodo get(int index), che restituisce l'elemento nella posizione specificata in questa lista.

Nel tuo esempio

<adam,15121990> 
<roy,01051995> 
<neha,05091992> 
<alisha,11051992> 

invocando CHILD_NAME_DOB.get(2) si otterrà <neha,05091992> (come oggetto Bambino)

+4

Perché quindi 'LinkedList' se si accede all'indice? – SorryForMyEnglish

+4

Questo ovviamente perderà tutti i vantaggi associati a una mappa, come la ricerca basata su chiave in O (1). – aioobe

+0

Come può accedere a una "riga" per indice in O (1)? La mappa non ha il concetto di indicizzazione. –

0

HashMap non ha un concetto di ordinamento, in modo da ottenere l'ingresso n-esimo non ha senso . Potresti usare invece un TreeMap, che è ordinato sulle sue chiavi.

Tuttavia, è necessario riconsiderare il modello in quanto sembra avere interessi in conflitto. Da un lato, l'accesso per indice è tipico per Lists, mentre l'accesso tramite chiave è tipico per Maps. Non sono sicuro della situazione in cui vorresti fare entrambe le cose.

Se si desidera realmente eseguire l'accesso sia all'indice che alla chiave, è possibile scrivere la propria struttura dati che memorizza i dati in un elenco combinato con una mappatura da chiave a indice e viceversa.Vorrei raccomandare contro questo, ma se è davvero quello che vuoi, allora penso che sia la soluzione migliore.

0

So che non è la soluzione migliore, ma che dire di questa soluzione (pseudocodice!). Basta combinare Elenco e Mappa in un'unica classe.

public class UserBirthday { 

    private List<String>  names   = new ArrayList<>(); 
    private Map<String, String> CHILD_NAME_DOB = new HashMap<String, String>(); 

    public void add(String name, String bd) { 

     if (!CHILD_NAME_DOB.containsKey(name)) { 
      names.add(name); 
     } 
     CHILD_NAME_DOB.put(name, bd); 

    } 

    public String getByName(String name) { 
     return CHILD_NAME_DOB.get(name); 
    } 

    public String getByIndex(int index) { 
     return getByName(names.get(index)); // TODO: range test 
    } 

    public static void main(String[] args) { 

     UserBirthday ub = new UserBirthday(); 
     ub.add("dit", "12345678"); 
     ub.add("lea", "234239423"); 
     ub.add("alex", "43534534"); 
     ub.add("ted", "099098790"); 

     System.out.println(ub.getByIndex(2)); 
     System.out.println(ub.getByName("alex")); 
    } 

} 

si può ottenere qualche problema se si rimuove una voce, ma dovrebbe essere solo un suggerimento.

+0

IMO questo è "zucchero sintattico". Quando invochi 'getByIndex (int index)' invochi anche 'names.get (index)', che accetta O (n) in ogni caso. Quindi, qual è la differenza con la mia risposta? –

+0

@FabrizioMorello cosa intendi con "names.get (index) prende O (n)"? – dit

+0

'names' è un' Elenco'. Quando invochi 'getByIndex (int index)', questo metodo a sua volta richiama 'names.get (index)'. Il metodo 'get' di' List' ha O (n) complessità. –

0
for (String key : hmList.keySet()) { 
     String value = hmList.get(key); 

     Log.e("HashMap values", "key=" + key + " ,value=" + value); 
    } 
0

È inoltre possibile utilizzare un ArrayMap anziché una HashMap. Per ottenere il valore mediante l'uso di indice:

ArrayMap.valueAt(index); 

per ottenere la chiave ad un uso di indice:

ArrayMap.keyAt(index); 
0

ottenere la chiave per indice da hashmap:

key = (new ArrayList<>(CHILD_NAME_DOB.keySet())).get(index) 

ottenere il valore da indice:

CHILD_NAME_DOB.get(key)