2017-12-02 5 views
0

私は単にJavaで学校にエクササイズしているが、すべての時間表示エラーNullPointerExceptionが表示されます。私はファイル(頂点)からデータを読み取ることができるプログラムを書く必要があります。次に、このデータからグラフサイズをカウントし、次にDFSアルゴリズムを使用して一貫したコンポーネントをカウントする必要があります。私のコードは良くないと知っていますが、私はまだJava(と英語:P)を学んでいます。グラフDFSアルゴリズムNullPointerException

あるtest.txt

0 1 0 4 
1 2 1 4 1 5 1 8 1 11 
2 6 
3 1 3 7 
4 8 
5 2 5 8 
6 5 6 7 6 9 
8 4 
9 5 9 7 
10 8 10 11 
11 8 11 9 11 12 
12 3 12 6 12 9 

例外

Exception in thread "main" java.lang.NullPointerException 
    at Search.DFS(Search.java:17) 
    at AppClient.main(AppClient.java:25) 

AppClient.class

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOError; 
import java.io.IOException; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class AppClient { 

    private static final String filename = "C:\\test.txt"; 
    private static List<Integer> sizeGraphList = new ArrayList<Integer>(); 
    private static List<Integer> numberOfVertex = new ArrayList<Integer>(); 
    static Graph graph; 
    static Search search; 

    public static void main(String[] args) throws IOException { 

     graph = new Graph(getGraphSize()); 
     addVertexToGraph(); 
     search = new Search(); 
     int result = search.DFS(); 
     System.out.println("Składowe: " + result); 
    } 

    private static int getGraphSize() throws IOException { 
     String Path = filename; 

     Path filePath = Paths.get(Path); 
     Scanner in = new Scanner(filePath); 

     while (in.hasNext()) { 
      if (in.hasNextInt()) { 
       sizeGraphList.add(in.nextInt()); 
      } else { 
       in.next(); 
      } 
     } 

     for (Integer x : sizeGraphList) { 
      System.out.println(x); 
     } 

     int sizeGraph = getSizeOfVertex(sizeGraphList); 
     System.out.println("Size: " + sizeGraph); 
     return sizeGraph; 
    } 

    private static int getSizeOfVertex(List<Integer> listOfVertex) { 

     for (int i = 0; i < listOfVertex.size(); i++) { 
      numberOfVertex.add(listOfVertex.get(i)); 
     } 

     for (int i = 0; i < numberOfVertex.size(); i++) { 
      for (int j = 1; j < numberOfVertex.size(); j++) { 
       if (i != j && numberOfVertex.get(i) == numberOfVertex.get(j)) { 
        numberOfVertex.remove(j); 
       } 
      } 
     } 

     int size = numberOfVertex.size(); 
     return size; 
    } 

    private static void addVertexToGraph() { 
     try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 

      String line = br.readLine(); 

      while (line != null) { 
       // String[] edge = line.trim().split("[^\\d]+"); 
       String[] edge = line.trim().split("\\s+"); 

       for (int i = 0; i < edge.length - 1; i += 2) { 
        int v = Integer.parseInt(edge[i]); 
        int u = Integer.parseInt(edge[i + 1]); 
        //System.out.println(v + ", " + u); 
        graph.addEdge(v, u); 
       } 

       line = br.readLine(); 
      } 

     } catch (IOException e) { 
      System.out.println("File does not exist!!!"); 
     } 
    } 
} 

Graph.class

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 

class Graph { 


    public List<LinkedList<Integer>> graphVertices; 
    public int[] processingRange; 



    Graph(int graphSize) { 

     graphVertices = new ArrayList<>(); 
     processingRange = new int[graphSize+1]; 
     for (int i = 0; i < graphSize; i++) { 
      graphVertices.add(i, new LinkedList<Integer>()); 
     } 
    } 

    void addEdge(int v, int u) { 
     LinkedList<Integer> list = graphVertices.get(v); 
     list.add(u); 
     graphVertices.set(v, list); 
    } 
} 

Search.class

import java.util.LinkedList; 
import java.util.List; 
import java.util.Stack; 

public class Search extends AppClient{ 

    private Stack<Integer> vertexesStack; 
    private int range; 
    private int scc; 
    Graph graph; 

    public Search() { 

    } 

    int DFS() { 
     boolean visited[] = new boolean[graph.graphVertices.size()+1]; 
     for (int i = 0; i < graph.graphVertices.size(); i++) 
      if (!visited[i]) { 
       dfsSearch(i, visited); 
      } 
     return scc; 
    } 

    private void dfsSearch(int v, boolean visited[]) { 
     graph.processingRange[v] = range++; 
     visited[v] = true; 
     vertexesStack.push(v); 
     if (!checkDistance(v, visited)) { 
      int top; 
      do { 
       top = vertexesStack.pop(); 
       graph.processingRange[top] = graph.graphVertices.size(); 
      } while (top != v); 
      scc++; 
     } 
    } 

    private boolean checkDistance(int v, boolean[] visited) { 
     int minRange = graph.processingRange[v]; 

     for (int vertex : graph.graphVertices.get(v)) { 

      if (!visited[vertex]){ 
       dfsSearch(vertex, visited); 
      } 

      if (graph.processingRange[vertex] < minRange) { 
       minRange = graph.processingRange[vertex]; 
      } 
     } 
     if (minRange < graph.processingRange[v]) { 
      graph.processingRange[v] = minRange; 
      return true; 
     } 
     return false; 
    } 
} 

答えて

2

あなたはAppClient.java

の1を参照するようにしたいので、あなたはまた、 Search.javavertexesStackを初期化し、ローカル変数を削除 AppClient.java

addVertexToGraph(); 
search = new Search(); // add this 
int result = search.DFS(); //possibly add graph as a parameter here 

searchを初期化しませんでした

private Stack<Integer> vertexesStack = new Stack<>(); // add this 
private int range; 
private int scc; 
// Graph graph; // delete this 

コードdiあなたのDFS()

+0

こんにちは、私のミス:)への呼び出しが、再びこの同じエラー例外:( – Mdr92

+0

にグラフでAppClient.javaパスで、その後>int DFS(Graph graph)と@ - dn'tあなたもint DFS()を変更する必要があります上部にpackage x.y.z;を持っていますMdr92他の間違いも見つけました。私はあなたのコードが正しいことを保証することはできませんが、デバッガ/プリントステートメントを使用して、今後あなたのコードが壊れている場所を調べてみてください。 – Kevin

+0

はいはいはい!作品:)ありがとうございます! – Mdr92

関連する問題