java - containsKey 检查嵌套的 LinkedHashMap
问题描述
我有一个嵌套的 HashMap(2 级)。顶层是日期,第二层可以包含三个枚举字符串之一和一个整数:
HashMap<LocalDate, HashMap<String, Integer>> hashMap = new HashMap<>();
我正在遍历一个 java 对象列表,这些对象的属性日期重复了许多日期,字符串属性 stringAttr 是“红色”、“绿色”、“蓝色”的枚举。我正在向 HashMap 添加:
if (hashMap.containsKey((a.startDate.toLocalDate()))) { // does date exist?
if (hashMap.get(a.startDate.toLocalDate()).containsKey(a.getStringAttr())) { // does String also exist?
previousValue = hashMap.get(a.startDate.toLocalDate()).get(a.getStringAttr()); //if date and String exist - set previousValue
} else {
previousValue = 0; // String does not exist
}
} else {
previousValue = 0; // Date does not exist
}
hashMap.put(a.startDate.toLocalDate(), new HashMap(){{put(a.getStringAttr(), previousValue + 1);}});
这正确地产生了一个唯一日期列表,但内部 HashMap 只列出一个字符串。
我试图将键/值对放入内部 HashMap 的方式有什么问题?
解决方案
在所有情况下,您都在替换与外部键关联的内部 Map。这消除了所有先前添加的映射。您应该在找到现有映射时更新它们,并在它们丢失时添加映射。
这是我认为您正在尝试做的事情的幼稚版本。
LocalDate date = a.startDate.toLocalDate();
String attr = a.getStringAttr();
// If the date is not a key, add it mapping to an empty Map
if (! hashMap.containsKey(date) {
hashMap.put(date, new HashMap<String,Intger>());
}
// If the attr is not an inner key, add it mapping to 0
if (! hashMap.get(date).containsKey(attr)) {
hashMap.get(date).put(attr, 0);
}
// increment
int previous = hashMap.get(date).get(attr);
hashMap.get(date).put(attr, previous + 1);
推荐阅读
- javascript - 使用 OpenLayers 和 CSS 网格布局时如何正确设置对齐方式
- sql - 在 SQL 中正确显示下一个计费周期开始日期 - [应根据报表运行日期显示未来计费日期]
- rust - 嵌套循环打印奇怪的结果
- java - Android - 在单独的线程中从 for 循环更新进度条
- r - 如何合并数据库,将一个值重复到另一个值中?
- android - 带有标题的 Recylerview 显示数据但负 1
- javascript - 在 for 循环中附加子文本的最佳实践
- c++ - SQL Server 连接 C++
- android - 如何读取安装在 android 7 版本上的 .pkcs12 证书
- php - php 脚本在一台机器上运行,而不是在另一台机器上运行