用 Java 打印 HashMap

我有一个 HashMap:

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

现在我要遍历所有的值并打印它们。

我写道:

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

好像不管用。

有什么问题吗?

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

673987 次浏览

你有几个选择

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

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

您给出的代码甚至不会编译,这一点在以后的问题中可能值得一提——“似乎不起作用”有点模糊!

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.entrySet().forEach(entry -> {
System.out.println(entry.getKey() + " " + entry.getValue());
});

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

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

keySet()返回的集合是 Set。您无法使用索引从集合中获取值,因此不存在从零开始还是从一开始的问题。如果散列映射有一个键,返回的 keySet()将在其中包含一个条目,其大小为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));
}

我使用 String 映射(如果您使用 String 映射)完成了这项工作。

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

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

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


example.forEach(consumer);

假设您已经重写了这两种类型的 toString方法(如果需要的话)。

查看键值对的简单方法:

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

Java8新特性 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


}
}

您可以使用 Entry类轻松地读取 HashMap

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

如果映射将一个集合作为值保存,那么其他的答案需要额外的工作来将它们转换为字符串,比如 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;
}

使用包含 Hash Map 引用的变量名称的简单 print 语句可以做到:

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

这是因为 toString()方法已经在由 HashMap Class扩展的 AbstractMap class中被重写 文档中的更多信息

返回此映射的字符串表示形式。字符串表示包含一个键值映射列表,其顺序由映射的 entrySet 视图的迭代器返回,用括号(“{}”)括起来。相邻映射由字符“ ,”(逗号和空格)分隔。每个键值映射都呈现为键后面跟一个等号(“ =”) ,后面跟一个相关联的值。键和值通过 String.valueOf (Object)转换为字符串。

对我来说,这句简单的话很管用:

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

用于快速打印 HashMap 中的条目

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

使用 java 8的特性

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

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

  • 使用 entryset()方法将 HashMap转换为 MapSet以获得 Map中的一组条目: < br > Set dataset = map.entrySet();
  • 获取这个集合的迭代器: < br > Iterator it = dataset.iterator();
  • 从迭代器获取 Map.Entry: < br > 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

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