如何在Android中从HashMap打印所有键和值?


70

我对Android开发非常陌生,并且尝试在Android示例项目中使用HashMap。现在,我正在做示例项目以学习android。我只是将键和值存储在HashMap中,我想在EditView中显示键及其值。我在示例项目中遵循以下代码。但是,第一个键和值仅在EditView中打印。

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

在EditViewiOS = 100中仅打印。我想在EditText中打印所有键及其值。谁能告诉我我做错了什么?提前致谢。


看到这个问题和其他许多人:stackoverflow.com/questions/1066589/...
安东

你好Gopinath!您用于获取和设置哈希映射键值的代码是正确的,但是您将这些值设置为仅一个textView。
Deepak Sharma 2012年

1
谢谢大家。我得到了答案。我再次感谢大家。
Gopinath 2012年

Answers:


11

首先,您的代码中存在错误,即。您在for循环中缺少分号和右括号。

然后,如果尝试将值追加到视图,则应使用textview.appendText()而不是.setText()。

这里有一个类似的问题:如何在Android TextView中更改文本


2
这是最好的答案,有关如何正确使用Java 5和Map.Entry的信息,也请参见@Shadow。
Dean Povey

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

12

这是因为您的TextView在每次迭代中都会收到新文本,并且丢弃了先前的值。通过StringBuilder连接字符串,并在循环后设置TextView值。您也可以使用这种类型的循环:

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

没有解决OP的代码的实际问题,这几乎是相同的。
user207421 '20

11

您可以使用Gson轻松实现:

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

结果将如下所示:

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

很有帮助 非常感谢。
Pooja

5

Java 8

map.entrySet().forEach(System.out::println);

5

使用Java 8:

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

1
你能请编辑在为什么这个代码回答了这个问题的解释?不鼓励仅使用代码的答案,因为它们没有教导解决方案。
内森·塔吉

OP希望打印所有键和值对。我认为这里不需要任何解释。这是一个非常古老的线程,已经得到了回答,也没有大脑问题。如果有人正在用Java8寻找解决方案,我已经写过,他/她可以做类似的事情。
mdev

1
mdev-即使有像您这样的专家都知道,这里有许多新手会从中受益。如果您提供了解释,则可能发现您的解决方案不正确。(未指定“结果”变量)。应该是:map.keySet()。forEach(key-> System.out.println(key +“->” + map.get(key))); ->将参数(左侧)与实现(右侧)分开。参见howtodoinjava.com/java8/foreach-method-exampledocs.oracle.com/javase/tutorial/java/javaOO/…–
Tihamer

Tihamer感谢您指出错字。我已经编辑了答案。
mdev

OP希望在文本字段中显示所有键和值,而他唯一的问题就是该部分。
user207421 '20

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

此代码已经过测试并且可以正常工作。

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

查尔斯


谢谢,将此添加到我的utils
moberme

0

您可以使用以下代码:

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

此代码将确保所有键都存储在变量中,然后打印!


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

对于每个单击此按钮以了解您的HashMap内容是什么的人,该toString方法(docs)实际上可用于大多数对象。(注意:java数组不是对象!)

因此,此炒锅可用于调试目的:

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

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

-1

Kotlin答案

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

您可能会找到其他包含filterValues的解决方案。请记住,使用filterValues检索Key值将包含大括号[]。

val key = map.filterValues {it = position}.keys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.