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