Список смежности HashMapне в состоянии найти его значения - PullRequest
1 голос
/ 11 января 2011

Я на полпути к отладке алгоритма поиска в ширину с использованием представления списка соседей графических данных: HashMap<String, ArrayList<Edge>>. Каждый ключ String - это название станции метро, ​​а каждый ArrayList - список границ для этой станции.

Я использую очередь для хранения узлов графа в порядке их прохождения. Поэтому я проверяю следующий в очереди имя его ребенка. Затем я хочу , чтобы получить дочерний ArrayList ребер из adjacencyList, используя что-то вроде childEdges = stationsAdjacencyList.get(childNodeName);.

Мой синтаксис немного отличается, но, пожалуйста, проверьте код ниже.

В настоящий момент функция .get () не возвращает ArrayList, а вместо этого возвращает null каждый раз. Я знаю, что поиск HashMap получает правильный ключ. Он просто отказывается дать мне какое-либо значение из своего связанного сегмента.

    while (!q.empty()) {    // 

        String endpointName; // the Key part for the next node lookup 

        // get next node (single entry of adjacency list)
        Map<String, ArrayList<Edge>> currentNode = (Map<String, ArrayList<Edge>>) q.deque(); 

        HashMap<String, ArrayList<Edge>> nextNode = new HashMap<String, ArrayList<Edge>>();

        for (Map.Entry<String, ArrayList<Edge>> node : currentNode.entrySet()) { // there is only one node

            ++levelCount; // next node iteration is one level down the tree

            for (Edge edge : node.getValue()) {  // for each of this nodes Edges

                endpointName = edge.getEndpoint(); // retrieve the name of adjacent

                if (!endpointName.equals(destination)) { // if it's not the destination



                    levelTracker.put(edge.getParent(), levelCount); // record the level in the tree of this node

                    ArrayList<Edge> nextNodeEdges = adjacencyList.get(endpointName);

                    nextNode.put(endpointName, nextNodeEdges); // create child node from endpoint

                    q.enqueue(nextNode); // add child to queue

                }
                else if (endpointName.equals(destination)) { // if we're done

                    path.add(endpointName); // record the destination in the path (reverse order)

                    getPathBack(edge, levelCount + 1); // + 1 levelCount to indicate destination level in tree 

                    break;
                }
            }
        }

    }

Извините, если код не такой чистый или с достойными комментариями, он постоянно меняется. Надеюсь, кто-нибудь скажет мне, почему ArrayList<Edge> nextNodeEdges = adjacencyList.get(endpointName); ничего не получает.

Спасибо !!

1 Ответ

2 голосов
/ 11 января 2011

Таким образом, хороший тест - это посмотреть, не вызовет ли вызов adjacencyList.get("valid endpoint"); в том же месте с жестко закодированным значением ненулевой список. Если этого не произойдет, то adjacencyList где-то будет уничтожено, если это произойдет, то endpointName не так правильно, как вы думаете.

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