Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的深度嵌套哈希映射_Java_Hashmap_Snakeyaml - Fatal编程技术网

Java中的深度嵌套哈希映射

Java中的深度嵌套哈希映射,java,hashmap,snakeyaml,Java,Hashmap,Snakeyaml,我用这个例子来说明 构建数据结构以存储节点名称和属性 以下是更新的代码: class NestedMap { private final HashMap<String, NestedMap> child; private Map<String, Object> value = new HashMap<>(); public NestedMap() { child = new HashMap<>(); setValue(null

我用这个例子来说明 构建数据结构以存储节点名称和属性

以下是更新的代码:

class NestedMap {

private final HashMap<String, NestedMap> child;

private Map<String, Object> value = new HashMap<>();

public NestedMap() {
    child = new HashMap<>();
    setValue(null);
}

public boolean hasChild(String k) {
    return this.child.containsKey(k);
}

public NestedMap getChild(String k) {
    return this.child.get(k);
}

public void makeChild(String k) {
    this.child.put(k, new NestedMap());
}

public Map<String, Object> getValue() {
    return value;
}

public void setValue(Map<String, Object> value) {
    this.value = value;
}
}

还有我的用法示例:

    class NestedMapIllustration {
        public static void main(String[] args) {

        NestedMap m = new NestedMap();

        m.makeChild("de");
        m.getChild("de").makeChild("content");
        m.getChild("de").getChild("content").makeChild("00");
        m.getChild("de").getChild("content").makeChild("0");
        m.getChild("de").getChild("content").makeChild("1");
        m.getChild("de").getChild("content").makeChild("01");
        m.getChild("de").getChild("content").getChild("01").makeChild("fieldsets");
        m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").makeChild("0");
        m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").makeChild("fields");
        m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").getChild("fields").makeChild("0");
        Map<String, Object> properties = new HashMap<>();
        properties.put("key", "value");
        properties.put("key2", "value");
        m.getChild("de").getChild("content").getChild("01").getChild("fieldsets").getChild("0").getChild("fields").setValue(properties);
}
我希望总是创建一个新的HashMap,在其中存储节点属性,而不是为每个值创建一个新对象

我通过访问JCR数据存储中的节点并提取它们的值和属性来接收数据结构。这是我的结果数据结构在输出yaml文件中的外观:


如何才能更有效地执行此操作?

您已经尽力让您使用任何键,但您使用的是字符串键,即使其中一个键是01,表示它是一个数字

我能由此得出结论,键总是字符串吗

在这种情况下,为什么不定义一个分隔符,比如斜杠,并使用一个普通的旧树形图呢?然后你可以做:

m.put("de/content/01/fieldsets/0/fields", properties);
m.subMap("de/content/01/", "de/content/010");
如果希望de/content/01“树”中的所有内容,可以执行以下操作:

m.put("de/content/01/fieldsets/0/fields", properties);
m.subMap("de/content/01/", "de/content/010");
上述内容将为您提供一个包含de/content/01的每个子级的映射。010结尾的0有“魔力”:零是ascii表中斜杠后的下一个字符

如果希望任何给定的键映射到任意数量的值,可以使用:

TreeMap<String, List<V>> map = new TreeMap<>();
使用递归解决问题


为什么不使用JSON这样的行业标准呢?我认为我需要为snakeyaml转储构建一个映射结构。您不需要映射结构,它只是用作类似列表的示例。如果您已经有了类结构,那么应该能够直接序列化它。即使你想要一个特定的结构,我也建议不要创建你自己的机制。我确实有类结构,但据我所知,我需要将它存储在内存中的一个对象中,然后才能使用snakeyaml转储它。这就是我试图将其存储在嵌套映射结构中的原因。对不起,我不明白你说的直接序列化是什么意思?所以你实际上不需要嵌套映射,你需要将一些数据转储为YAML。现在你可以找到问题的根源了。我建议您阅读snakeyaml文档,看看如何将文件分部分编写,首先尝试将内容转换为地图是在浪费时间。是的,密钥是一个字符串。我更新了代码,删除了您建议的泛型。我不知道如何使用你建议的树状图结构。我需要保留节点的层次结构,即知道谁是父节点。层次结构在排序中是固有的:树状图是固有排序的。这就是诀窍。要找到父项,只需扫描最后一个斜杠并删除所有文本,直到最后一个斜杠。
public HashMap<String,Object> nestedMap(Node node) {

           HashMap<String, Object> map = new LinkedHashMap<>();

           PropertyIterator pi;
            try {
                pi = node.getProperties();
                //Get properties for the root node
                   while(pi.hasNext())
                    {
                       Property p = pi.nextProperty();
                       String name = p.getName();
                       String val = p.getString();

                       map.put(name,val);

                    }//end of while for properties of root node
            } catch (RepositoryException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


           Iterable<Node> children;
            try {
                children = NodeUtil.getNodes(node);
                for (Node child : children) {

                    if (!child.getPrimaryNodeType().getName().contains("mgnl:page")) {  
                      map.put (child.getName(), nestedMap(child));

                   }//end of checking if PrimaryNodeType is of type mgnl:page
                }

            } catch (RepositoryException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return map;
        }