Wie drucke ich alle Schlüssel und Werte von HashMap in Android?


70

Ich bin sehr neu für die Android-Entwicklung und versuche, HashMap in einem Android-Beispielprojekt zu verwenden. Jetzt mache ich ein Beispielprojekt für Android lernen. Ich speichere nur Schlüssel und Werte in HashMap, ich möchte die Schlüssel und ihre Werte in EditView anzeigen. Ich habe in meinem Beispielprojekt den folgenden Code befolgt. Der erste Schlüssel und Wert wird jedoch nur in EditView gedruckt.

   Map<String, String> map = new HashMap<String,String>();
   map.put("iOS", "100");
   map.put("Android", "101");
   map.put("Java", "102");
   map.put(".Net", "103");

   Set keys = map.keySet();

   for (Iterator i = keys.iterator(); i.hasNext(); ) {
       String key = (String) i.next();
       String value = (String) map.get(key);
       textview.setText(key + " = " + value);
   }

In EditView iOS = 100wird nur gedruckt. Ich möchte alle Schlüssel und ihren Wert in EditText drucken. Kann mir bitte jemand sagen, wo ich falsch mache? Danke im Voraus.


Siehe diese und viele andere Fragen: stackoverflow.com/questions/1066589/…
Anton

Hallo Gopinath !! Ihr Code zum Abrufen und Festlegen des Hash-Map-Schlüsselwerts ist korrekt, aber Sie setzen diesen Wert auf nur eine Textansicht.
Deepak Sharma

1
Dank an alle. Ich habe die Antwort bekommen. Nochmals danke ich Ihnen allen.
Gopinath

Antworten:


11

Erstens gibt es Fehler in Ihrem Code, dh. In der for-Schleife fehlen ein Semikolon und eine schließende Klammer.

Wenn Sie dann versuchen, Werte an die Ansicht anzuhängen, sollten Sie textview.appendText () anstelle von .setText () verwenden.

Hier gibt es eine ähnliche Frage: Wie ändere ich Text in Android TextView?


2
Dies ist die beste Antwort, aber siehe auch @Shadow für die ordnungsgemäße Verwendung von Java 5 für und Map.Entry.
Dean Povey

184
for (Map.Entry<String,String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  // do stuff
}

12

Dies liegt daran, dass Ihre Textansicht bei jeder Iteration neuen Text erhält und der vorherige Wert weggeworfen wird. Verketten Sie Zeichenfolgen mit StringBuilder und legen Sie den TextView-Wert nach der Schleife fest. Sie können auch diese Art von Schleife verwenden:

for (Map.Entry<String, String> e : map.entrySet()) {
    //to get key
    e.getKey();
    //and to get value
    e.getValue();
}

11
HashMap <Integer,Integer> hm = new HashMap<Integer,Integer>();

Set<Integer> keys = hm.keySet();  //get all keys
for(Integer i: keys)
{
    System.out.println(hm.get(i));
}

Behebt nicht das eigentliche Problem mit dem Code des OP, der fast identisch ist.
user207421

11

Mit Gson können Sie es einfacher machen:

Log.i(TAG, "SomeText: " + new Gson().toJson(yourMap));

Das Ergebnis sieht folgendermaßen aus:

I/YOURTAG: SomeText: {"key1":"value1","key2":"value2"}

Hilfreich. Vielen Dank.
Pooja


5

Mit Java 8:

map.keySet().forEach(key -> System.out.println(key + "->" + map.get(key)));

1
Könnten Sie bitte eine Erklärung bearbeiten, warum dieser Code die Frage beantwortet? Nur-Code-Antworten werden nicht empfohlen , da sie die Lösung nicht vermitteln.
Nathan Tuggy

OP möchte alle Schlüssel- und Wertepaare drucken. Ich glaube nicht, dass hier eine Erklärung nötig ist. Es ist ein sehr alter Thread, der bereits beantwortet wurde, und auch keine Gehirnsache. Ich habe bereits geschrieben, wenn jemand nach einer Lösung in Java8 sucht, kann er / sie so etwas tun.
Mdev

1
mdev - Es gibt hier viele Neulinge, die von einer Erklärung profitieren würden, auch wenn es für einen Experten wie Sie offensichtlich ist. Wenn Sie eine Erklärung geliefert hätten, hätten Sie möglicherweise festgestellt, dass Ihre Lösung falsch ist. (Die Variable "Ergebnis" ist nicht angegeben). Es sollte sein: map.keySet (). ForEach (Schlüssel -> System.out.println (Schlüssel + "->" + map.get (Schlüssel))); Wobei -> die Parameter (links) von der Implementierung (rechts) trennt. Siehe howtodoinjava.com/java8/foreach-method-example und docs.oracle.com/javase/tutorial/java/javaOO/…
Tihamer

Tihamer Danke, dass du auf den Tippfehler hingewiesen hast. Ich habe die Antwort bearbeitet.
Mdev

Das OP möchte alle Schlüssel und Werte in einem Textfeld anzeigen , und sein einziges Problem besteht in diesem Teil davon.
user207421

3
    for (String entry : map.keySet()) {
      String value = map.get(entry);
      System.out.print(entry + "" + value + " ");
      // do stuff
    }

2
String text="";

    for (Iterator i = keys.iterator(); i.hasNext() 
       {
           String key = (String) i.next();
           String value = (String) map.get(key);
           text+=key + " = " + value;
       }

        textview.setText(text);

1

Dieser Code ist getestet und funktioniert.

public void dumpMe(Map m) { dumpMe(m, ""); }
private void dumpMe(Map m, String padding) {
  Set s = m.keySet();
  java.util.Iterator ir = s.iterator();
  while (ir.hasNext()) {
    String key = (String) ir.next();
    Object value = m.get(key);
    if (value == null) continue;
    if (value instanceof Map) {
      System.out.println (padding + key + " = {");
      dumpMe((Map)value, padding + "  ");
      System.out.println(padding + "}");          
    }
    else if (value instanceof String  ||
             value instanceof Integer ||
             value instanceof Double  ||
             value instanceof Float   ||
             value instanceof Long ) {

      System.out.println(padding + key + " = " + value.toString());
    }
    else { 
      System.out.println(padding + key + " = UNKNOWN OBJECT: " + value.toString());
      // You could also throw an exception here
    }      
  } // while

} // dumpme

Charles.


Vielen Dank, fügte dies zu meinen Utensilien
Moberme

0

Sie können diesen Code verwenden:

for (Object variableName: mapName.keySet()){
    variableKey += variableName + "\n";
    variableValue += mapName.get(variableName) + "\n";
}
System.out.println(variableKey + variableValue);

Dieser Code stellt sicher, dass alle Schlüssel in einer Variablen gespeichert und dann gedruckt werden!


0
public void dumpMe(Map m) { dumpMe(m, ""); }

private void dumpMe(Map m, String padding) 
{
    Set s = m.keySet();
    java.util.Iterator ir = s.iterator();
    while (ir.hasNext()) 
    {
        String key = (String) ir.next();
        AttributeValue value = (AttributeValue)m.get(key);
        if (value == null) 
            continue;
        if (value.getM() != null)
        {
            System.out.println (padding + key + " = {");
            dumpMe((Map)value, padding + "  ");
            System.out.println(padding + "}");          
        }
        else if (value.getS() != null  ||
                 value.getN() != null ) 
        {
            System.out.println(padding + key + " = " + value.toString());
        }
        else 
        { 
            System.out.println(padding + key + " = UNKNOWN OBJECT: " + value.toString());
            // You could also throw an exception here
        }      
    } // while
}

//This code worked for me.

1
Bitte schauen Sie, wie man
antwortet

-1

Für alle, die darauf geklickt haben, um herauszufinden, was der Inhalt Ihrer HashMap ist, die toStringMethode ( docs funktioniert ) tatsächlich mit den meisten Objekten. (Hinweis: Ein Java-Array ist kein Objekt!)

Das ist also perfekt für Debugging-Zwecke:

System.out.println(myMap.toString());

>>> {key1=value1, key2=value2}

-1

Kotlin Antwort

for ((key, value) in map.entries) {
    // do something with `key`
    // so something with `value`
}

Möglicherweise finden Sie andere Lösungen, die filterValues ​​enthalten. Denken Sie daran, dass das Abrufen eines Schlüsselwerts mit filterValues ​​geschweifte Klammern [] enthält.

val key = map.filterValues {it = position}.keys
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.