提问人:DerekYeeter 提问时间:8/30/2022 最后编辑:BohemianDerekYeeter 更新时间:8/30/2022 访问量:324
在 Java 中检索嵌套的键值对
Retrieving nested key:value pairs in Java
问:
我想知道如何构建嵌套的地图,然后检索嵌套的键:值对。这就是我创建要嵌套的地图的方式。
//Create List of Nested HashMaps
List<Map> nestedMap = new ArrayList<>();
nestedMap.add(building3Map);
nestedMap.add(building31Map);
nestedMap.add(buildingHFTFMap);
System.out.println("The nested map is: " + nestedMap);
这是以下代码的系统输出:
The nested map is: [{buildingname=[Building 3], buildingid=[3]}, {buildingname=[Building 31], buildingid=[1]}, {buildingname=[HFTF], buildingid=[4]}]
这是正确的,因为我想要一个地图列表。但下一步是让我感到困惑的。当我尝试构建外层地图时,如下所示:
HashMap<String, List<Map>> queryMap = new HashMap<>();
queryMap.put("buildings", nestedMap);
System.out.println(queryMap.get("buildings.buildingid"));
尝试该方法时,我得到的系统输出为 null。理想情况下,我需要输出如下所示:.get("buildings.buildingid")
[[3, 1, 4]]
其中,它返回数组中键为 的所有值。我是编码新手,所以如果我犯了任何基本错误,请告诉我,以及如何创建一个嵌套的地图,我可以访问内层,或者是否有其他方法应该使用。"buildings.buildingid"
答:
我认为你把它弄得太复杂了。您可以将数据存储在一个简单的映射中,例如,ID 是键,名称是值。因此,您只需从地图中读取键或值即可获得结果。
Map<Integer, String> myMap = new HashMap<>();
myMap.put(3, "Building 3");
myMap.put(31, "Building 31");
myMap.put(4, "HFTF");
System.out.println(myMap.keySet());
System.out.println(myMap.values());
但是,Java 是一种面向对象的语言。如果它对你的用例有意义,你可能想要创建一个自定义类“Building”,而不是疯狂地尝试将数据存储在嵌套的数据结构中。请参阅下面的示例,了解使用自定义类的外观:
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String args[]) {
List<Building> buildings = new ArrayList<>();
buildings.add(new Building(3, "Building 3"));
buildings.add(new Building(31, "Building 31"));
buildings.add(new Building(4, "HFTF"));
List<Integer> buildingIds = new ArrayList<>();
buildings.forEach(building -> buildingIds.add(building.getBuildingId()));
List<String> buildingNames = new ArrayList<>();
buildings.forEach(building -> buildingNames.add(building.getBuildingName()));
System.out.println(buildingIds);
System.out.println(buildingNames);
}
public static class Building {
int buildingId;
String buildingName;
public Building(final int buildingId, final String buildingName) {
this.buildingId = buildingId;
this.buildingName = buildingName;
}
public int getBuildingId() {
return buildingId;
}
public void setBuildingId(final int buildingId) {
this.buildingId = buildingId;
}
public String getBuildingName() {
return buildingName;
}
public void setBuildingName(final String buildingName) {
this.buildingName = buildingName;
}
}
}
queryMap.get("buildings.buildingid")
返回 null,因为 键 下仅包含一个值。A 只能使用存储该值的同一键访问该值。键和值不会以任何进一步的方式进行处理。queryMap
buildings
HashMap
一个简单的替代方案可能是
queryMap.get("buildings").stream() // Create a Stream<Map>
.map(building -> building.get("buildingid")) // Create Stream<String> by extracting the buildingid values.
.collect(Collectors.toList()); // Collect Stream into a List<String> which contains the buildingid's
如果你不喜欢这个解决方案,可以更深入地研究属性表达式,并编写你自己的映射实现来解析这些表达式。但是要让它正常工作需要做很多工作......
评论
of null
” - 这是意料之中的,因为根据您提供的代码,map 不包含键。"buildings.buildingid"
queryMap.get("building")
for(Map<String, String> map : nestedMap) {System.out.println(map)}
List<Map>
Map<String, Map>