我有一个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.Entry
的getKey()
和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
}