2016-09-11 3 views
1

初心者はここ!!私のプロジェクトでは、ファイルからデータを文字列として読み込み、隣接リストを持つBFS用のグラフを作成する必要があります。ファイルから各行を読み込み、最初の文字列をキーとして、隣の文字列をキーとして取得します。しかし、私はnullポインタの例外を取得する理由は理解できません。私のコードを見てください。私のファイルは、このファイルから文字列を読み込んで、グラフの隣接リストを作成する

city.txt

city1 city2 10 
city1 city3 15 
city2 city1 5 
city2 city3 6 
city2 city4 22 
city2 city5 1 
city3 city4 9 
city3 city5 16 
city4 city1 4 
city4 city2 8 
city5 city2 1 
city5 city3 13 

のように見え、私のGraph.javaファイルが

import java.io.*; 
import java.util.*; 

public class Graph { 

    Map<String, LinkedList<String>> adj; 

    public Graph() { 
    // TODO Auto-generated constructor stub 
    } 

    public Graph(String[] nodes) 
    { 
     adj = new HashMap<String, LinkedList<String>>(); 
     for (int i = 0; i < nodes.length; ++i) 
     { 
      adj.put(nodes[i], new LinkedList<String>()); 
     } 
    } 

    public void addNeighbor(String v1,String v2) { 
     adj.get(v1).add(v2); 
    } 

    public List<String> getNeighbors(String v) { 
     return adj.get(v); 
    } 

    public void getKeyValuePairs() 
    { 
     Iterator iterator = adj.keySet().iterator(); 

     while (iterator.hasNext()) { 
      String key = iterator.next().toString(); 
      LinkedList<String> value = adj.get(key); 
      System.out.println(key + " " + value); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     File file = new File("city.txt"); 
     FileReader fr = new FileReader(file); 
     BufferedReader br = new BufferedReader(fr); 
     String line = br.readLine(); 
     String [] tokens = line.split("\\s+"); 
     String [] nodes = new String[tokens.length]; 
     for (int i = 0; i < nodes.length; ++i) { 
      nodes[i] = tokens[i]; 
     } 

     Graph g = new Graph(nodes); 
     String var_1 = tokens[0]; 
     String var_2 = tokens[1]; 
     //String var_3 = tokens[2]; 



     while((line = br.readLine()) != null) 
     { 

      tokens = line.split("\\s+"); 
      nodes = new String[tokens.length]; 
      for (int i = 0; i < nodes.length; ++i) { 
       nodes[i] = tokens[i]; 
      } 

      var_1 = tokens[0]; 
      var_2 = tokens[1]; 
      //String var_3 = tokens[2]; 

      g.addNeighbor(var_1, var_2); 

     } 
     g.getKeyValuePairs(); 
     br.close(); 
    } 

    } 

である私は、ラインg.addNeighbor(VAR_1でnullポインタ例外エラーを取得していますvar_2)どうすれば問題を解決できますか?誰かがこれのためのいくつかの解決策を提案することができます。

EDIT ..

私はまた、隣接リストを表示するgetKeyValuePairs()を使用して、私はいくつかの奇妙な出力を取得しています。これがどうして起こるのか、考えられるでしょうか?

出力:

[city2] 
city1 [city2, city2] 
city2 [city2, city2, city2, city2] 
city3 [city2, city2] 
city4 [city2, city2] 
city5 [city2, city2] 

答えて

1

あなたのHashMapの影響調整後では頂点VAR_1が含まれていないため。最初の行の頂点のみをグラフに追加します。

編集:

public class Graph 
{ 
    Map<String, LinkedList<String>> adj; 

    public Graph() { 
     adj = new HashMap<String, LinkedList<String>>(); 
    } 

    public void addNode(String node) 
    { 
     adj.putIfAbsent(node, new LinkedList<String>()); 
    } 

    public void addNeighbor(String v1,String v2) { 
     adj.get(v1).add(v2); 
    } 

    public List<String> getNeighbors(String v) { 
     return adj.get(v); 
    } 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     File file = new File("city.txt"); 
     FileReader fr = new FileReader(file); 
     BufferedReader br = new BufferedReader(fr); 
     String line; 
     String [] tokens; 

     Graph g = new Graph(); 
     while((line = br.readLine()) != null) 
     { 
      tokens = line.split("\\s+"); 
      g.addNode(tokens[0]); 
      g.addNode(tokens[1]); 
      g.addNeighbor(tokens[0], tokens[1]); 
     } 
     br.close(); 
    } 
} 
1

あなたのMapに追加するのを忘れ:以下の作業のサンプルです。

if(adj.get(v1) == null) { 
    adj.put(v1, new LinkedList<String>()); 
} 

完全なコード

import java.io.*; 
import java.util.*; 

public class Main { 

    private Map<String, LinkedList<String>> adj; 

    public Main() { 
     // TODO Auto-generated constructor stub 
    } 

    public Main(String[] nodes) 
    { 
     adj =new HashMap<String, LinkedList<String>>(); 
     System.out.println("nodes" + nodes.length); 
     for (int i = 0; i < nodes.length; ++i) 
     { 
      adj.put(nodes[i], new LinkedList<String>()); 
     } 
    } 

    public void addNeighbor(String v1,String v2) { 
     if(adj.get(v1) == null) { 
      adj.put(v1, new LinkedList<String>()); 
     } 
     adj.get(v1).add(v2); 
    } 

    public List<String> getNeighbors(String v) { 
     return adj.get(v); 
    } 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     File file = new File("city.txt"); 
     FileReader fr = new FileReader(file); 
     BufferedReader br = new BufferedReader(fr); 
     String line = br.readLine(); 
     String [] tokens = line.split("\\s+"); 
     String [] nodes = new String[tokens.length]; 
     for (int i = 0; i < nodes.length; ++i) { 
      nodes[i] = tokens[i]; 
     } 

     Main g = new Main(nodes); 
     String var_1 = tokens[0]; 
     String var_2 = tokens[1]; 
     //String var_3 = tokens[2]; 

     while((line = br.readLine()) != null) 
     { 
      System.out.println(" test " + line); 
      tokens = line.split("\\s+"); 
      nodes = new String[tokens.length]; 
      for (int i = 0; i < nodes.length; ++i) { 
       nodes[i] = tokens[i]; 
      } 
      var_1 = tokens[0]; 
      var_2 = tokens[1]; 
      g.addNeighbor(var_1, var_2); 

     } 
     br.close(); 
    } 

} 
+0

私は出力が正しくないなぜあなたは提案を提供することができます質問の編集を行っている。ここでは、マップに追加バグ修正とあなたのコードです。 – Karthi13

+0

解決済み... whileループのvar_2変数にコメントがあります。 – Karthi13

関連する問題