Хранение arrayList в другом arrayList заканчивается пустыми списками - PullRequest
0 голосов
/ 30 ноября 2018

Я использую поиск в глубину по ненаправленному графику, чтобы найти пути от начального узла до конечного узла.Все узлы вдоль пути хранятся в ArrayList.Но поскольку может быть несколько путей, идущих от начала до конца, я решил сохранить каждый из ArrayLists, которые содержат узлы вдоль путей к другому ArrayList, поэтому второй ArrayList должен содержать все решения ArrayLists.

ОднакоКогда я тестировал код, он всегда заканчивался тем, что ArrayLists по какой-то причине были пустыми, и я не уверен, когда это так.Это мой код для обхода DFS:

private void pathDepthFirstSearch(Graph graph, GraphNode u, GraphNode v) throws GraphException {
    listOfNodes.add(u); //Adds the starting node to the ArrayList
    u.setMark(true); //Marks it as visited.
    if(u.getName() == v.getName()) { //Managed to get to the end node.(.getName() returns int values).
        listOfSolutions.add(listOfNodes); //Add this Path solution to the ArrayList that contains a list of solutions.
        numOfSolutions++; //Number of solutions increment by 1.
    } else {
        for (Iterator<GraphEdge> iter = graph.incidentEdges(u); iter.hasNext();) {
            GraphEdge nextEdge = iter.next();
            GraphNode secondEndPoint = nextEdge.secondEndpoint();
            if(secondEndPoint.getMark() == false) { //Checks if the end point of the edge has been visited or not, if not, then call the method recursively.
                pathDepthFirstSearch(graph,secondEndPoint, v);
            }
        }
    }
    listOfNodes.remove(u); //Finished exploring u, so remove it from the Solution ArrayList.
    u.setMark(false); //Mark as un-visited.
}

И код для вызова функции с указанными startNode и endNode:

private List<GraphNode> listOfNodes = new ArrayList<GraphNode>(); //The ArrayList to store one path solution.
private List<List<GraphNode>> listOfSolutions = new ArrayList<>(); //The ArrayList to store all the ArrayList path solutions.
public Iterator<GraphNode> solve() throws GraphException {
    GraphNode startNode = new GraphNode(startLoc); //Creates the starting node.
    GraphNode endNode = new GraphNode(endLoc); //Creates the end node.
    pathDepthFirstSearch(graph, startNode, endNode);
    //returns one of the solutions from the ArrayList of solutions (listOfSolutions) 
    //depending on if we want the longest or shortest path. If the list is empty, 
    //then null is returned instead.
}

После запуска этого в моей основной функции, которая печатаетузлы из ArrayList, который возвращается из метода solve (), я получаю сообщение «решение не найдено», которое я устанавливаю так, чтобы оно происходило только тогда, когда метод возвратил нуль.

Почему ArrayListпустой, хотя в методе DFS к нему должны были быть добавлены узлы, а затем список добавлен в listOfSolutions?

...