Обход глубокой структуры данных и удаление объекта - PullRequest
2 голосов
/ 18 февраля 2012

У меня есть функция для обхода сложной глубокой структуры 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);
    }
}

1 Ответ

2 голосов
/ 18 февраля 2012

Чтобы удалить нужный узел (parent), измените свой

parent = null;

на

arr.remove(parent);

Установка на null ничего не удаляет, просто изменяетссылка, которая когда-то указывала на узел, возвращается к нулю.Чтобы удалить, вам нужно сделать это явно, используя HashMap.remove () метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...