2016-11-03 1 views
1

私は、入力ファイルから隣接行列を作成する方法を理解するのに苦労しています。入力ファイルは、ノードの有向グラフ、重み付きグラフを表すものとします。入力テキストファイルを使用して、有向グラフを表現するための隣接行列の作成方法[java]?

目的は、繰り返し深さの最初の検索を行うことができるプログラムを作成することですが、私は本当に割り当てのデータ入力部分に固執しています。

入力テキストファイルには、おそらく次のようになります。

各ノードは、2行のテキストで表現されます。たとえば、一番上の行にある最初の「S」はノードの名前であり、2番目の「S」は開始ノードであることを示し、3番目の「n」はゴールノードではなく通常のノードであることを示し、これは 'g'で示されます。 2行目に

1の重み付き距離と「S」最初ある「B」に接続された2つのノード、および2

第三の重み付き距離を有する第二ある「E」であります行が空白であると想定され、パターンが繰り返されます。

S S n      
B 1 E 2    


B N n 

C 2 F 3 


C N n 

D 2 GA 4 

D N n 

GA 1 

E N n 

B 1 F 3 H 6 

F N n 

I 3 GA 
3 C 1 

GA N g 

H N n 

I 2 GB 2 F 1 

I N n 

GA 2 GB 2 

GB N g 

私は本当にこれに固執しています。私はファイルをスキャンするためにバッファリングされたリーダーを使用していますが、私はScannerを使用する方が簡単だろうと思っています。

私は現在、名前を持つ属性を持つNodeオブジェクトを作成しようとしています。また、何らかのリンクリストを使って他の隣接するNodeオブジェクトへのリンクを作成しようとしています。私はまた、ノードオブジェクトの配列を使用することを検討しましたが、どのノードがどの他のノードに接続するかを表現する方法と、2次元配列を使用して隣接行列に構築する方法を実際には分かりません。

任意の提案をいただければ幸い私の質問は、学術的に重要ではない場合、私は他の人に

編集謝罪ので、私は初心者だ:のactionPerformed ます。public void(のActionEvent e)は:私のコードは次のようなものです

: {

if(e.getSource() == openButton) 
    { 
     returnVal = fileChooser.showOpenDialog(null); 

     if(returnVal == JFileChooser.APPROVE_OPTION) 
     { 
      selected_file = fileChooser.getSelectedFile(); 

      String file_name = fileChooser.getSelectedFile().getName(); 
      file_name = file_name.substring(0, file_name.indexOf('.')); 

      try 
      { 
       BufferedWriter buff_writer = null; 
       File newFile = new File("."+file_name+"_sorted.txt");   

       boolean verify_creation = newFile.createNewFile(); 
       //if (verify_creation) 
       // System.out.println("file created successfully"); 
       //else 
       // System.out.println("file already present in specified location"); 

       file_reader1 = new BufferedReader(new FileReader(selected_file)); 
       file_reader2 = new BufferedReader(new FileReader(selected_file)); 

       FileWriter file_writer = new FileWriter(newFile.getAbsoluteFile()); 
       buff_writer = new BufferedWriter(file_writer); 

       //find the number of nodes in the file 
       while((currentLine = file_reader1.readLine()) != null) 
       { 
        k++; 
        System.out.println("value of k: " + k); 
       } 


       nodeArray = new Node[k]; 

       while((currentLine = file_reader2.readLine()) != null) 
       { 
        //System.out.print(currentLine); 

        String[] var = currentLine.split(" "); 


        nodeArray[x] = new Node(var[0], var[1], var[2]); 
        nodeArray[x].setLink1(new Node(var[3], null, null)); 



       } 

      buff_writer.close(); 
      file_writer.close(); 

      } 
      catch (Exception e1) 
      { 
       e1.printStackTrace(); 
      }  
     } 
    } 

編集#2

私のノードオブジェクトは、次のようになります210

public Node(String n, String t1, String t2) 
{ 
    name = n; 
    type1 = t1; 
    type2 = t2; 

    link1 = null; 
    link2 = null; 
    link3 = null; 
    link4 = null; 
    link5 = null; 
    link6 = null; 
+0

これまでに試したコードを投稿して、どこで失敗するか教えてください。 – bradimus

+0

確かに、私はちょうど本当にこだわっていると思います。どのノードが他のどのノードに接続しているかを把握するために、リンクされたリストを作成する必要がありますか?または、これらのオブジェクトをすべて作成することなく、ファイルを直接2次元配列に読み込む方法がありますか?私にとっては難しいのは、私はノードオブジェクトの数が不明であるだけでなく、各ノードがお互いに持つ可能性のある未知数の接続についても考慮しようとしていることです。これは私にとって本当に混乱しています。 – GScott

+0

おかしい。私は数週間前に非常によく似た質問に答えたと思います。まったく同じ入力例のように。あなたが気にしないなら、これはどんな種類の授業を分かち合うことができますか?私は自分の答えを見つけることができませんでした...しかし、私はあなたのためにもっと "概念的"なものを置いています... – GhostCat

答えて

1

何かは:ではありませんここでは2次元配列を使用します。あなたは元に戻って、あなたが働いている "実際の問題"に合ったクラス/データ構造を設計/モデル化したいと思っています。

つまり、問題はノードとエッジのグラフを表現することです。だから、いくつかのヒントあなたが軌道に乗るために...

で始まることができます:

enum NodeType { START, GOAL, NORMAL ; } 

public class Node { 
    private final String name; 

    public Node(String name) { 
    this.name = name; 

上記はあなたのノードの種類を区別するための合理的な方法を提供します。そして、ノードの表現から始めます。明らかに、その名前は固定です。ノードの作成後にノードの名前を変更する必要はありません。[レコードの

public void addNeighborNode(Node node, int weight) { 
    neighbors.put(node, weight); 

:理論的には、あなたがAを作成することができ、その後、あなたは

public void setType(NodeType type) ... 

そしてより多くのフィールド、

private final Map<Node, Integer> neighbors = new HashMap<>(); 

と新しい隣人を追加するための方法のようなセッターを持っていますコンストラクタを介してすべての情報を取得するクラスであり、セッタメソッドを持つ必要はありません。それには一定の利点がありますが、事態はより複雑になります。私はあなたがここに示しているものはすでに十分に複雑です;-)]

ここでの全体的なアイデアは、PARSINGをオブジェクトの表現/構築方法から分離することです。もちろん、ある時点でその文字列を読んでからノードオブジェクトを構築する必要があります。

しかし、その後、あなたがテキストファイルの解析を必要とせずに...グラフを構築することができますので、あなたは、より良い、上記のようなNodeクラスを開始します。つまり

Node n1 = new Node("n1"); 
n1.setType(NodeType.START); 

Node n2 = new Node("n2"); 
n2.setType(NodeType.GOAL); 

n1.setNeighborNode(n2, 5); 

:最初のビルドをグラフの素敵な "クラスモデル"。そして、上記のようなテストコードを書くことができます。そして、そのすべてがうまくいくと、その入力ファイルを読み込んで、それをグラフを構築するために必要なメソッド呼び出しに変換するコードを記述します。

短いストーリー:もちろん、そのテキストファイルを解析することは重要ですが、ではなく、に焦点を当ててください。代わりに:あなたのデータのクラスモデルについて多くを考えてください最初。それはあなたが最も学び、実験で最も楽しい時間を過ごすことができたということです。ストリングを引っ張ってオブジェクトに変換するのは、単に「仕事」です。まず楽しい一日を!

+0

お世話になりました。私はあなたが私を軌道に戻してくれたように感じます、ありがとう – GScott

+0

あなたは大歓迎です。と他の場合、より良い答えが入ってくる、受け入れについて忘れないでください;-)しかし、そこに時間を取る、私はそれが来るのための評判を気にしない...ちょっと今夜後に、 – GhostCat

関連する問題