在 Java 中检索嵌套的键值对

Retrieving nested key:value pairs in Java

提问人:DerekYeeter 提问时间:8/30/2022 最后编辑:BohemianDerekYeeter 更新时间:8/30/2022 访问量:324

问:

我想知道如何构建嵌套的地图,然后检索嵌套的键:值对。这就是我创建要嵌套的地图的方式。

//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"

Java 嵌套列表

评论

0赞 Alexander Ivanchenko 8/30/2022
“I get a system output of null - 这是意料之中的,因为根据您提供的代码,map 不包含"buildings.buildingid"
0赞 Beez 8/30/2022
您可以接收嵌套的地图,然后从那里操作,即循环浏览地图列表以打印结果。queryMap.get("building")for(Map<String, String> map : nestedMap) {System.out.println(map)}
0赞 Bohemian 8/30/2022
A 不是“嵌套映射”。A 是嵌套映射。List<Map>Map<String, Map>

答:

0赞 Eritrean 8/30/2022 #1

我认为你把它弄得太复杂了。您可以将数据存储在一个简单的映射中,例如,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;
        }
    }
}
0赞 magicmn 8/30/2022 #2

queryMap.get("buildings.buildingid")返回 null,因为 键 下仅包含一个值。A 只能使用存储该值的同一键访问该值。键和值不会以任何进一步的方式进行处理。queryMapbuildingsHashMap

一个简单的替代方案可能是

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

如果你不喜欢这个解决方案,可以更深入地研究属性表达式,并编写你自己的映射实现来解析这些表达式。但是要让它正常工作需要做很多工作......

评论

0赞 DerekYeeter 8/30/2022
非常感谢!这个 stream() 方法正是我一直在寻找的知识空白。