Невозможно загрузить из байтового / логического массива, потому что «BlackWhite.marked» имеет значение null

#java #graph

#java #График

Вопрос:

Когда я запускаю свой приведенный ниже код, я продолжаю получать ошибку из заголовка этого сообщения, хотя я не знаю почему. Я попытался: Arrays.fill(marked, false); , я пытаюсь выяснить, сколько белых узлов и черных узлов подключаются, которые не существуют в blacknodes[] .

 public class BlackWhite {
    private static boolean[] marked;

public BlackWhite(Graph G, int s) {
    marked = new boolean[G.V()];
    dfs(G, s);
}

public static int count(Graph G, int[] blacknodes) {
    int rw_count = 0;

    for (int w : G.adj(blacknodes.length)) {
        if (marked(w)) {
            rw_count  ;
        }
    }

    return rw_count;
}

private void dfs(Graph G, int v) {
    marked[v] = true;
    for (int w : G.adj(v)) {
        if (!marked[w]) {
            dfs(G, w);
        }
    }
}

public static boolean marked(int v) {
    return marked[v];
}

public static void main(String[] args) {
    Graph G = new Graph(3);
    G.addEdge(1, 2);
    G.addEdge(4, 1);
    G.addEdge(1, 8);

    System.out.println(BlackWhite.count(G, new int[] { 1 })); // should print 3
}
  

}

Ответ №1:

Вы инициализируете marked массив в конструкторе BlackWhite класса. Но в вашем основном методе вы никогда не вызывали new BlackWhite() . Таким образом, ваш marked массив по-прежнему равен null при вызове статического count метода.

Вы должны изменить свой метод подсчета следующим образом.

 public static int count(Graph G, int[] blacknodes) {
    int rw_count = 0;
    if(marked == null) marked = new boolean[G.V()];

    for (int w : G.adj(blacknodes.length)) {
        if (marked(w)) {
            rw_count  ;
        }
    }

    return rw_count;
}
  

Комментарии:

1. Спасибо. Как я могу использовать DSF? Как я могу сравнить с входным массивом?

2. Вы можете удалить static из метода count и использовать BlackWhite blackwhite = new BlackWhite() ; а затем BlackWhite.count(G, new int[] { 1 })); это должно вызвать конструктор и запустить dfs на вашем графике.