Как я могу разобрать строки данных из файла, чтобы заполнить объекты для каждого? - PullRequest
0 голосов
/ 30 июня 2018

У меня есть текстовый файл со списком внутри, в каждой строке есть данные, которые мне нужно вставить в новые объекты. Таким образом, данные выглядят как somename=3000 или другой тип с косой чертой data another type = 6000.

У меня есть определенный класс "Item", который имеет переменные String и int. Данные должны быть вставлены в них. Каждый новый объект должен быть добавлен в ArrayList<Item>.

// Calculate the lines for next for each loop
int lineCount = 0;
while (sc.hasNextLine()) {
    lineCount++;
    sc.nextLine();
}

for (int i = 0; i < lineCount; i++) {
    // creating the object
    Item item = new Item();
    // add item object to items ArrayList
    items.add(item);

    // add line to String variable lineToString,
    while (scaner.hasNextLine()) {
        String lineToString = scaner.nextLine();
        sc.nextLine();
    }

Итак, я понял, что для этого мне нужно

  • скопировать всю строку и поместить в некоторую строковую переменную;
  • разделить его на целочисленную и строковую переменную;
  • вставка частей строки в переменную String и чисел в переменную int в конкретном объекте, который был создан во время итерации цикла for.
  • добавить объект с данными внутри в ArrayList.

Я использовал Scanner для чтения текстового файла. Когда я пытаюсь вставить scaner.nextLine в String, это не работает; Я имею в виду, что он выполняется, но переменная String lineToString не имеет строки из текстового файла.

Может ли кто-нибудь помочь с идеей, как лучше решить эту проблему? Может быть, есть какой-то более простой способ вставить два разных типа данных из строки текстового файла в объект и поместить их в ArrayList? Каждая строка в текстовом файле имеет разные данные и должна быть в разных объектах.

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Помимо того, что @Ashish Mishra упомянул, вы делаете второй цикл while в цикле for, почему? Разве одного цикла недостаточно?

    int lineCount = 0;
    while (sc.hasNextLine()) {
        lineCount++;
        String lineToString = sc.nextLine();
        Item item = new Item();
        //convert lineToString to item
        items.add(item);
    }
0 голосов
/ 30 июня 2018

Вы не упомянули четко формат строки из текстового файла. Я предполагаю, что пока у вас есть текстовый файл, в котором каждая строка похожа на

someone=140000

И вы пытаетесь прочитать эти строки текста и проанализировать каждую из них для объекта Item, который содержит свойство String (я полагаю, вы называете его name) и свойство int ( Я полагаю, вы называете это number)

Если это так, вам нужно прочитать текстовый файл построчно и обработать его дальше. Есть несколько способов читать текстовый файл построчно.

BufferReader

Это очень распространенный и пока наиболее подходящий способ чтения текстового файла с точки зрения производительности.

List<Item> particulatItems = new ArrayList<>();

// using try-with-resource that will help closing BufferedReader by own
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       particularItems.add(processLine(line));
    }
}

Сканер

Вы также можете использовать Scanner.

try (Scanner scanner = new Scanner(new File(fileName))) {
     while (scanner.hasNext()) {
        particularItems.add(processLine(line));
     }

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

Вы должны извлечь логику обработки строк в независимую функцию. Это хорошая практика чистого кодирования.

public static Item processLine(Strinng line) {
     String[] tokens = line.split("=");
     Item item = new Item(tokens[0], tokens[1]);
}

Предполагается, что у вас есть конкретный объект , определенный как Item, и вы заполняете List этого типа

 public class Item {
    String name;
    int number;

    public Item(String name, String numtxt) {
       this.name = name;
       this.number = Integer.parseInt(numtxt);
    }

   // setter getter
 }

Подробнее:

  1. Как читать большой текстовый файл построчно с помощью Java?
  2. Различные способы чтения текстового файла в Java
  3. Разница между сканером и BufferReader
  4. Try-with-resources в Java 7
0 голосов
/ 30 июня 2018

Похоже, вы уже отсканировали полный файл в следующем фрагменте кода:

while (sc.hasNextLine()) {
    lineCount++;
    sc.nextLine();
}

После этого вы снова выполняете цикл for, но с тем же сканером, который прочитал последнюю строку. Таким образом, следующее может вернуть false:

while (scaner.hasNextLine()) 

Я, возможно, никогда не войду в цикл

Вы должны сбросить сканер перед повторной итерацией строк .. или, возможно, использовать что-то еще, кроме сканера, для подсчета строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...