Как перебирать текстовый файл для выполнения различных задач (включая создание неизвестного количества объектов) в зависимости от того, какую строку я читаю

Здравствуйте, я студент низкого уровня по компьютерным наукам, который действительно борется / незнаком с файловым вводом / выводом.

Я пытаюсь читать в текстовом файле с помощью буферизованного читателя. Я понимаю, как использовать цикл while для продолжения сканирования до тех пор, пока не будет достигнут конец файла, но как я могу дать указание своему читателю прочитать только одну строку и что-то сделать, пока не будет достигнут конец этой одной строки, а затем прочитать следующую строку и сделать что-нибудь, пока не закончится эта строка и т.д.?

в основном мой входной текстовый файл будет повторяться каждые три строки. Текстовый файл представляет узлы в взвешенном ориентированном графе.

Входной текстовый файл предположительно будет выглядеть следующим образом:

каждый узел представлен двумя строками текста. Например, в самой верхней строке первая буква "S" - это имя узла, вторая буква "S" указывает, что это начальный узел, третья буква "n" означает, что это обычный узел, а не целевой узел, который будет обозначен как "г".

Во второй строке находятся два узла, соединенные с "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]?

если бы кто-нибудь мог указать мне правильное направление, я был бы вечно благодарен

2 ответа

Что касается смежных узлов, используйте ArrayList, который является динамически изменяемым массивом.

Вам нужен ArrayList для каждого узла, который хранит информацию о соседних узлах этого узла.

Таким образом, вам понадобится массив, содержащий (k делится на 3) ArrayLists.

Что касается проблемы ввода, ваш цикл while обрабатывает каждую строку, которую читает одинаково. Вам нужно будет добавить переменную, чтобы отслеживать, с какой строкой в ​​последовательности из трех строк вы имеете дело.

Другие вопросы по тегам