2015-03-11 13 views
10

mam:Zdobądź klucz HashMap w Androidzie przez położenie lub indeksu

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

Załóżmy wartości w CHILD_NAME_DOB są:

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

Próbuję pobrać ostatni element kluczowy z CHILD_NAME_DOB. To znaczy, chcę pobrać klucz alisha z powyższego przykładu do tymczasowego String name.

Chcę również wiedzieć, jak pobrać dane według indeksu.

Np .: jeśli int index = 2, chcę klucz "Neha" w String name

TIA.

Edytuj: Wartość DateOfBirth (dane wartości w CHILD_NAME_DOB) jest dynamiczna i nie jest znana. Tak więc THIS LINK nie jest tym, czego chcę.

+0

'HashMaps' nie ma indeksów. Prawdopodobnie to, czego szukasz, to 'LinkedHashMap', choć nikt się nie domyśla. – EJP

+0

@EJP, Tak, moje złe. Myślę, że powinienem wybrać 'LinkedHashMap'. – DancingMonkeyOnLaughingBuffalo

+0

Hej, chłopaki, co powiesz na to, czy mi się podoba [this] (http://stackoverflow.com/a/3422405/2798218). Użyj 'interatora', ale zadeklaruj' Klucz łańcucha' i 'wartość' poza 'iteratorem'. W ten sposób zdobędę ostatni kluczowy element. – DancingMonkeyOnLaughingBuffalo

Odpowiedz

3

Dzięki @ Pentium10 za this answer. I niewiele zmodyfikowałem zgodnie z moimi potrzebami.

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(); 

Otrzymuję ostatni kluczowy element przez to.

Będę aktualizował, jak tylko znajdę łatwy sposób na kluczowanie według indeksu.

+1

To * nie * będzie działać niezawodnie dla HashMap. Musisz użyć LinkedHashMap, jak już wspomniałem w mojej odpowiedzi. – aioobe

+0

Na początku działało 'HashMap'. Ale później, po kilku losowych testach, zwrócił nieoczekiwane wyniki. Potem próbowałem 'LinkedHashMap' i działało dobrze również z moim testowaniem losowym. Na koniec wybrałem opcję 'LinkedHashMap'. Dziękuję @ aioobe. – DancingMonkeyOnLaughingBuffalo

+0

Czy przez przypadek używasz Java 8? – aioobe

1

Pobieranie "ostatniego" klucza i pobranie według indeksu nie jest obsługiwane przez HashMap. Możesz użyć parametru LinkedHashMap i wyszukać element z indeksem 2 (lub ostatnim elementem), wykonując iterację. Ale będzie to operacja O (n).

Proponuję użyć List<Pair<String, String>>, jeśli kolejność klawiszy/wartości jest dla ciebie ważna i chcesz przeprowadzić wyszukiwanie oparte na indeksie.

Jeśli zarówno odnośnika klucz oparty oraz indeks oparty jest dla ciebie ważne, można użyć połączonej struktury danych, które składa się zarówno z List i HashMap, ale należy pamiętać, że usunięcie elementów będzie O(n).

+0

hmm. Może masz rację. Lemme również czekać i zobaczyć dla innych odpowiedzi – DancingMonkeyOnLaughingBuffalo

1

Można utworzyć klasy Child

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

.... 

} 

a następnie umieścić ten przedmiot w formie listy

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

w ten sposób można wywołać metodę get(int index), która zwraca element w określonym położeniu na tej liście.

W przykładzie

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

powołując CHILD_NAME_DOB.get(2) dostaniesz <neha,05091992> (jako obiekt podrzędny)

+4

Dlaczego więc 'LinkedList' jeśli masz dostęp do indeksu? – SorryForMyEnglish

+4

To oczywiście utraci wszystkie korzyści związane z mapą, takie jak wyszukiwanie oparte na kluczach w O (1). – aioobe

+0

Jak uzyskać dostęp do "wiersza" według indeksu w O (1)? Mapa nie ma koncepcji indeksowania. –

0

HashMap nie posiada koncepcję uporządkowania, więc uzyskanie wpisu n-tego nie ma sensu . Zamiast tego można użyć numeru TreeMap, który jest uporządkowany na jego kluczach.

Należy jednak ponownie rozważyć model, ponieważ wydaje się, że ma on sprzeczne interesy. Z jednej strony dostęp do indeksu jest typowy dla Lists, natomiast dostęp za pomocą klucza jest typowy dla Maps. Nie jestem pewien, w której sytuacji chciałbyś robić jedno i drugie.

Jeśli naprawdę chcesz wykonać indeks i klucz dostępu, możesz napisać własną strukturę danych, która przechowuje dane na liście w połączeniu z mapowaniem z klucza na indeks i odwrotnie.Polecam przeciw temu, ale jeśli tak naprawdę tego chcesz, to myślę, że to najlepsze rozwiązanie.

0

Wiem, że to nie jest najlepsze rozwiązanie, ale co z tym rozwiązaniem (pseudokod!). Wystarczy połączyć listę i mapę w jednej klasie.

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")); 
    } 

} 

Po usunięciu wpisu mogą wystąpić problemy, ale powinna to być tylko sugestia.

+0

IMO to "cukier syntaktyczny". Kiedy wywołujesz 'getByIndex (indeks int), wywołujesz także' names.get (index) ', który i tak zajmuje O (n). Czym więc różni się moja odpowiedź? –

+0

@FabrizioMorello co masz na myśli, gdy "names.get (index) trwa O (n)"? – dit

+0

'names' to" Lista ". Gdy wywołasz 'getByIndex (indeks int), ta metoda z kolei wywołuje' names.get (index) '. Metoda 'get' z' List' ma złożoność O (n). –

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

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

Można również użyć ArrayMap zamiast HashMap. Aby uzyskać wartość przy użyciu indeksu:

ArrayMap.valueAt(index); 

aby dostać klucz przy użyciu indeksu:

ArrayMap.keyAt(index); 
0

dostać klucz od indeksu z hashmap:

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

uzyskać wartość przez indeks:

CHILD_NAME_DOB.get(key) 
Powiązane problemy