1

こんにちは、私は低レベルの comp sci の学生で、ファイル I/O に本当に苦労している/慣れていません。

バッファリーダーを使用してテキストファイルを読み込もうとしています。while ループを使用してファイルの最後に到達するまでスキャンを続ける方法は理解していますが、リーダーに 1 行だけを読み込んで、その 1 行の終わりに到達するまで何かを実行してから、次の行を読み込んで、その行が終了するまで何かをしますか?

基本的に、入力テキスト ファイルは 3 行ごとに繰り返されます。テキスト ファイルは、加重有向グラフのノードを表します。

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

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

2 行目には、「S」に接続された 2 つのノードがあり、最初のノードは加重距離が 1 の「B」で、2 番目のノードは加重距離が 2 の「E」です。

3 行目は空白と見なされ、パターンが繰り返されます。

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 

私のコードは次のとおりです。

public void actionPerformed(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]);


                        if (var[1].equals('S') || var[1].equals('s'))
                            nodeArray[x].setType(NodeType.START);
                        else if (var[2].equals('g') || var[2].equals('G'))
                            nodeArray[x].setType(NodeType.GOAL);
                        else
                            nodeArray[x].setType(NodeType.NORMAL);

                        x++;

                }

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

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

私のノードクラスは次のとおりです。

import java.util.*;


enum NodeType 
{
    START, GOAL, NORMAL;
}

public class Node 
{

private String name;
private NodeType typeOfNode;
private final Map<Node, Integer> neighbors = new HashMap<>();


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

public void setType(NodeType type)
{
    typeOfNode = type;
}

public void addAdjacentNode(Node node, int distance)
{
    neighbors.put(node, distance);
}




public String toString()
{
    String output = "";

    output += "node name: " + name + ",\n";

    return output;
}

}

私のもう 1 つの大きな問題は、繰り返される 3 行シーケンスの 2 行目をどのように処理するかということです。2 行目は、すべての隣接ノードと、1 行目に記述されたノードからの重み付けされた距離を示します。問題は、特定のノードに隣接するノードがいくつ存在するかがわからないことです。技術的には、まったく存在しないか、多数存在する可能性があります。

ここの親切なプログラマーは、ハッシュマップを使用して隣接ノードを記録することを提案しましたが、そのような隣接の不確定数を説明するためにコード行を構成する方法がわかりません

注:この質問は、私が尋ねたこの以前の質問に関連しています:入力テキストファイルを使用して隣接行列を作成し、有向加重グラフを表す方法[java]?

誰かが私を正しい方向に向けることができれば、私は永遠に感謝します

4

2 に答える 2

0

隣接するノードについては、動的にサイズ変更される配列である ArrayList を使用します。

ノードごとに、そのノードの隣接ノードに関する情報を格納する ArrayList が必要です。

したがって、(k を 3 で割った) ArrayLists を含む配列が必要になります。

于 2016-11-05T21:43:28.367 に答える