用Java打印HashMap


129

我有一个HashMap

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

现在,我想遍历所有值并打印它们。

我这样写:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

它似乎不起作用。

问题是什么?

编辑:另一个问题:此集合是零基础吗?我的意思是,如果它具有1个键并且值将为0或1?


2
我建议您熟悉Java的文档(它将回答您的许多问题)。例如,这是Mapsize()方法的文档:“返回此映射中的键-值映射关系的数目。如果该映射包含多个Integer.MAX_VALUE元素,则返回Integer.MAX_VALUE。”
亚当·佩恩特

您的代码正在寻找“键中的值”-这是不正确的。在Keys中寻找key还是在Values中寻找value
d-live

2
如果它具有1个键/值,则其大小当然为1。但这与从零开始的索引无关。
杰斯珀

这是一个很好的问题。但是,如果您看到Mingfei的解决方案,那么这里提供的答案可以在一行中完成。
HoldOffHunger

Answers:


140

keySet()仅从哈希图中返回一组键,您应该迭代此键集,并使用这些键从哈希图中获取值。

在您的示例中,哈希映射键的类型为TypeKey,但是您是TypeValue在通用的for循环中指定的,因此无法对其进行编译。您应该将其更改为:

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Java8更新:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

如果您不需要打印键值而只需要哈希图值,则可以使用其他人的建议。

另一个问题:这个集合是零基数吗?我的意思是,如果它具有1个键并且值将为0或1?

从集合返回的集合keySet()Set。您不能使用索引从Set中获取值,因此这不是从零开始还是从一开始的问题。如果您的哈希图具有一个键,则返回的keySet()将在其中包含一个条目,其大小为1。


19
for (Map.Entry<String, String> entry : map.entrySet()) { ... }
更妙的

2
甚至更紧凑: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

查看键值对的一种简单方法:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

方法1和方法2都输出以下内容:

[{b=2, a=1}]

21
只需作为:System.out.println(map);,输出:{b=2, a=1}
Mingfei

是的...还有一个类似的输出:System.out.println(map.toString());
Yo Apps

1
在这种情况下,@ yoapps提防NPE。这就是为什么我.toString尽可能避免的原因。
Maroun

确实如此。NPE总是潜伏在这样的捷径中。我只想显示一个类似的输出。.我想尤其是当您调试到日志/控制台时,您只是想窥视一个其数据不为null的地图。这是一声大火!但是,如果它的代码从头开始检查……那么您是对的,它很棘手,并且在良好的编程环境中,应该避免使用它!
Yo Apps,

40

假设您有一个Map<KeyType, ValueType>,可以这样打印:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

要同时打印键和值,请使用以下命令:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
您在第3行的半冒号之前缺少另一个括号。
nktsamba '18


9

您需要值集,而不是键集:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

您提供的代码甚至都无法编译,这可能在以后的问题中值得一提-“似乎无效”有点含糊!


8

值得一提的是Java 8方法,使用BiConsumer和lambda函数:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

假设您已toString根据需要重写了这两种类型的方法。


7

对我来说,这一行很有效:

Arrays.toString(map.entrySet().toArray())

6

一个简单的带有变量名称的打印语句,其中包含哈希映射的引用:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

之所以toString()可行,是因为该方法已被覆盖,该方法已 被文档中AbstractMap classHashMap Class更多信息扩展

返回此映射的字符串表示形式。字符串表示形式由键值映射列表组成,这些键值映射由映射的entrySet视图的迭代器返回,并用大括号(“ {}”)括起来。相邻的映射用字符“,”(逗号和空格)分隔。每个键值映射均表示为键,后跟等号(“ =”),后跟关联的值。键和值通过String.valueOf(Object)转换为字符串。


2
这似乎是上述方法的最佳答案。
卡兰·阿胡亚

5

Java 8新功能forEach样式

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

我使用String Map(如果您正在使用String Map)做到这一点。

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

使用Java 8功能


3
尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
戴夫

2

有助于快速打印HashMap中的条目

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

如果映射将集合作为值保存,则其他答案需要付出额外的努力才能将它们转换为字符串,例如Arrays.deepToString(value.toArray())(如果是列表值的映射)等。

我经常遇到这些问题,并遇到了使用来打印所有对象的通用函数ObjectMappers。这在所有地方都很方便,尤其是在进行实验时,我建议您选择这种方式。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

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.