1

你好,我是一个低级的comp sci学生,对文件i / o真的很挣扎/不熟悉。

我正在尝试使用缓冲阅读器读取文本文件。我了解如何使用 while 循环继续扫描,直到到达文件末尾,但是我如何指示我的读者只读取一行并执行某些操作,直到到达该行的末尾,然后读取下一行并做某事直到该行结束,等等?

基本上我的输入文本文件将每三行重复一次。文本文件表示加权有向图中的节点。

输入文本文件应该如下所示:

每个节点由两行文本表示。例如最上面一行,第一个'S'是节点的名称,第二个'S'表示它是一个开始节点,第三个'n'表示它是一个常规节点,而不是一个目标节点,这将由“g”表示。

第二行是连接到“S”的两个节点,第一个节点是“B”,加权距离为 1,第二个节点是“E”,加权距离为 2。

第三行应该是空白的,模式是重复的。

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;
}

}

我的另一个主要问题是如何处理重复的三行序列中的第二行。第二行给出了所有相邻节点及其与第一行描述的节点的加权距离。问题是,我不知道任何给定节点将存在多少个相邻节点。从技术上讲,可能没有,或者可能有很多。

一位善良的程序员建议我使用哈希映射来记录相邻节点,但我不确定如何构造一行代码来解释不确定数量的此类邻接

注意:这个问题参考了我之前提出的这个问题:如何使用输入文本文件创建邻接矩阵来表示有向加权图 [java]?

如果有人能指出我正确的方向,我将永远感激

4

2 回答 2

0

就输入问题而言,您的 while 循环将其读取的每一行都视为相同。您必须添加一个变量来跟踪您正在处理的 3 行序列中的哪一行。

于 2016-11-05T21:40:32.383 回答
0

至于相邻节点使用 ArrayList,它是一个动态大小的数组。

每个节点都需要一个 ArrayList,它存储有关该节点的相邻节点的信息。

因此,您将需要一个包含(k 除以 3)ArrayLists 的数组。

于 2016-11-05T21:43:28.367 回答