java - 遍历深层数据结构并删除对象

标签 java pointers reference

我有一个函数可以遍历复杂的深层 HashMap 结构。我的问题是,当我找到所需的节点并对它执行任何操作(例如删除它)时,我实际上并没有对数据结构执行任何操作,而是对数据结构的副本进行操作。我认为 C++ 中的指针可以解决我的问题,那么我如何在 Java 中做到这一点?

代码:

private HashMap parentNode = null;
// a complex JSON string of arrays / objects, won't list for brevity
private String jsonString = ...
// parses JSON string into HashMaps for objects and Object[ ]s for arrays
private HashMap arr = (HashMap)JSON.parse(jsonString);
// find the node with an id of 27
HashMap parent = findNode(arr, "27");
// Print arr before modifying node
System.out.println(arr);
// modify parent in some way
parent = null;    
// Print arr after modifying node
System.out.println(arr);

public HashMap findNode(HashMap map, String id) {
    parentNode = null;
    findNodeRecursive(map, id);
    return parentNode;
}

public void findNodeRecursive(HashMap map, String id) {
    for(Object entry : map.entrySet()){
        Object value = ((Map.Entry)entry).getValue();
        if((value instanceof String) && ((String)value).equals(id))
            parentNode = map;
        else if(value instanceof HashMap)
            findNodeRecursive((HashMap)value,id);
        else if(value instanceof Object[])
            for(int i=0; i<((Object[])value).length; i++)
                findNodeRecursive( (HashMap)(((Object[])value)[i]) ,id);
    }
}

最佳答案

要删除所需的节点(父节点),请更改

parent = null;

arr.remove(parent);

将其设置为null不会删除任何内容,只是将曾经指向该节点的引用更改回null。要删除,您需要使用 HashMap.remove() 显式执行此操作。方法

关于java - 遍历深层数据结构并删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338645/

相关文章:

c - 为什么带星号和不带星号的指针变量在 printf 中表现不同?

.net - 如何告诉 Visual Studio 自动加载某些引用?

java - 自动引用 Android 布局组件

c++ - Lint 警告 与指针结合的算术表达式中的可疑截断

java - Selenium 脚本启动层初始化期间显示错误

c++ - 涉及指针成员变量和多态性的很奇葩的问题

rust - Rust 的确切自动解引用规则是什么?

php - 将平面数组转换为 3d 数组,在每个非数字值上创建新的分组行

java - azure应用程序服务上的spring boot应用程序在启动后立即停止

java - 如果空间已满,则线性对齐 View 中的项目以转到下一行