Как прочитать текстовый файл с токенами и сохранить содержимое каждого токена в массив объектов Java - PullRequest
0 голосов
/ 07 мая 2018

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

objects[
        [process0, [1,2,3,4,5]], 
        [process1, [6,7,8,9,10]], 
        [process2, [1,2]]
 ]

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

List<String> process_numbers = new ArrayList<String>();

Моя идея состоит в том, чтобы прочитать токен, затем взять числа перед следующим токеном и сохранить их в объекте, а затем добавить объект в список объектов, поэтому в основном мне нужна помощь с этим.

Примечание: Я явно не очень хорошо разбираюсь в Java, не стесняйтесь предлагать способы улучшить мой код.

Main.java

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
         File f = new File("processes.txt");
         Scanner sc = new Scanner(f);

         List<Objects> objects = new ArrayList<Objects>();
         String process_name = " ";
         List<String> process_numbers = new ArrayList<String>();

         while(sc.hasNextLine()){

            String line = sc.nextLine();
            if (line.matches(".*process.*")){
                process_name = line;
                //System.out.println("PROCESS NAME: " + line);
            }else{
                process_numbers.add(line);
                //System.out.println("NUMBER: " + line);
            }

            Objects o = new Objects(process_name, process_numbers);
            objects.add(o);
        }

      } catch (FileNotFoundException e) {
         e.printStackTrace();
     }
  }
}

Objects.java

import java.util.ArrayList;
import java.util.List;
public class Objects {
    private String process_name;
    List<String> process_numbers = new ArrayList<String>();

    public Objects(String process_name, List<String> process_numbers){
      this.process_name = process_name;
      this.process_numbers = process_numbers;
    }

    public String getProcess_name() {
      return process_name;
    }

    public void setProcess_name(String process_name) {
     this.process_name = process_name;
    }

    public List<String> getProcess_numbers() {
     return process_numbers;
    }

    public void setProcess_numbers(List<String> process_numbers) {
     this.process_numbers = process_numbers;
    }

 }

processes.txt

process0
1
2
3
4
5
process1
6
7
8
9
10
process2
1
2

EDIT:

Я изменил цикл while следующим образом:

        while(sc.hasNextLine()) {

            String line = sc.nextLine();
            List<String> process_numbers = new ArrayList<String>();
            if (line.matches(".*process.*")) {
                process_name = line;
                line = sc.nextLine();
            }

            while (!line.matches(".*process.*") && sc.hasNextLine()) {
                process_numbers.add(line);
                line = sc.nextLine();
            }

            Objects o = new Objects(process_name, process_numbers);
            objects.add(o);

        }

        for(Objects obj : objects) {
            System.out.println(obj.getProcess_name());
            System.out.println(obj.getProcess_numbers());

        }

Я получаю желаемый результат, но с некоторыми проблемами, во-первых, имена процессов одинаковы ("process0"), и программа не печатает самый последний номер текстового файла.

Результат пока

process0
[1, 2, 3, 4, 5]
process0
[6, 7, 8, 9, 10]
process0
[1]

1 Ответ

0 голосов
/ 07 мая 2018

Вы почти получили его, но всегда пропускали строку с именем процесса

String line = sc.nextLine();
while(sc.hasNextLine()) {
    List<String> process_numbers = new ArrayList<String>();
    if (line.matches(".*process.*")) {
        process_name = line;
        line = sc.nextLine();
    }

    while (!line.matches(".*process.*") && sc.hasNextLine()) {
        process_numbers.add(line);
        line = sc.nextLine();
    }
    if(!sc.hasNextLine()){
         process_numbers.add(line);
    }

    Objects o = new Objects(process_name, process_numbers);
    objects.add(o);

}

Выход:

process0
[1, 2, 3, 4, 5]
process1
[6, 7, 8, 9, 10]
process2
[1, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...