在Java中打印哈希图



我有一个HashMap

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

现在我想浏览所有值并打印它们。

我写了这个:

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

它似乎不起作用。

问题出在哪里?

编辑:另一个问题:这个集合是从零开始的吗?我的意思是,如果它有 1 个键和值,大小是 0 还是 1?

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

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

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

Java8 更新:

example.forEach((key, value) -> System.out.println(key + " " + value));
<小时 />

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

另一个问题:这个集合是零基的吗?我的意思是,如果它有 1 个键和值,它的大小是 0 还是 1?

keySet() 返回的集合是一个Set。您无法使用索引从集合中获取值,因此这不是它是从零开始还是从一开始的问题。如果您的哈希映射有一个键,则返回的keySet()内部将有一个条目,其大小将为 1。

查看键值对的简单方法:

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}]

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

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

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

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

您有多种选择

  • 获取map.values() ,获取值,而不是键
  • 获取同时具有两者map.entrySet()
  • 获取keySet()并为每个按键调用map.get(key)
对我来说

,这简单的一行效果很好:

Arrays.toString(map.entrySet().toArray())
map.forEach((key, value) -> System.out.println(key + " " + value));

使用 java 8 功能

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

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

这是有效的,因为toString()方法已经在AbstractMap class中被覆盖,HashMap Class文档中的更多信息

返回此映射的字符串表示形式。字符串表示形式由键值映射列表组成,其顺序由映射的 entrySet 视图的迭代器返回,括在大括号 ("{}") 中。相邻映射由字符 "、"(逗号和空格)分隔。每个键值映射都呈现为键,后跟等号 ("="),后跟关联的值。键和值通过 String.valueOf(Object) 转换为字符串。

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

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

你给出的代码甚至不会编译,这可能值得在以后的问题中提及 - "似乎不起作用"有点模糊!

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

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

假设您已经在需要时重写了这两种类型的toString方法。

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

用于快速打印哈希图中的条目

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

我使用字符串映射(如果您正在使用字符串映射)做到了这一点。

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

使用 java 8 功能:

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

使用Map.Entry,您可以像这样打印:

 for(Map.Entry entry:map.entrySet())
{
    System.out.print(entry.getKey() + " : " + entry.getValue());
}

从映射中获取所有键和值的传统方法,您必须遵循以下顺序:

  • HashMap转换为MapSet,以使用entryset()方法获取Map中的条目集:
    Set dataset = map.entrySet();
  • 获取此集合的迭代器:
    Iterator it = dataset.iterator();
  • 从迭代器获取Map.Entry
    Map.Entry entry = it.next();
  • 使用Map.EntrygetKey()getValue()方法来检索键和值。
Set dataset = (Set) map.entrySet();
Iterator it = dataset.iterator();
while(it.hasNext()){
    Map.Entry entry = mapIterator.next();
    System.out.print(entry.getKey() + " : " + entry.getValue());
}

使用 java 8 打印地图

Map<Long, String> productIdAndTypeMapping = new LinkedHashMap<>();
productIdAndTypeMapping.forEach((k, v) -> log.info("Product Type Key: " + k + ": Value: " + v));

如果映射将集合保存为值,则其他答案需要额外的努力将它们转换为字符串,例如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;
}
您可以使用

Entry类轻松阅读HashMap

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}

最新更新