Как создавать объекты, используя записи в текстовом файле (Java) - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над программой для своего класса Java, в которой я использую файл предметов (предметов одежды), который представляет инвентарь для магазина. Каждый Retail_Item имеет четыре атрибута: int itemNumber, String description, int numInInventory и двойная цена.

Я пытаюсь понять, как читать каждую строку из файла и превращать каждую строку в объект. Моей первой мыслью было создать время l oop с такими переменными, как currentItemNumber, currentDescription и др. c. Поэтому я попробовал это:

while (file.hasNextLine()) {
        currentItemNumber = file.nextInt();
        currentDescription = file.next

    } // end while

Но я застрял там, потому что каждый раз, когда я читал строку в сканер, я всегда использовал nextLine. Хотя здесь это нельзя использовать, поскольку каждая строка содержит несколько атрибутов объекта, а не строку в строке. Есть ли способ сделать это в структуре, которую я пытаюсь использовать, или я должен делать это по-другому? Я знаю, что видел и делал некоторые вещи, где разбивал строку на отдельные части, которые, как я видел, люди называют «жетонами». Будут ли люди рекомендовать читать каждую строку, а затем разбирать ее на отдельные токены, а затем назначать каждому токену соответствующий атрибут? Тогда, я думаю, мне нужно было бы привести эти токены к соответствующему объекту, так как я думаю, что чтение всей строки, а затем ее разбор сделало бы каждую часть строкой.

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

1000     Pants      10     19.99
2000     Jeans       2     25.95
3000     Shirt      12     12.50

Заранее благодарим за мудрость, если вы Я понял.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Следующий код выполняет ваше требование, как указано в вашем вопросе, а именно, как создать экземпляр класса RetailItem из строки текста из вашего текстового файла. Я предполагаю, что он использует вещи, которые вы, возможно, еще не изучили, такие как класс Paths и try-with-resources . Это просто используется для сканирования вашего файла.

Во-первых, класс RetailItem содержит членов, которых вы описали в своем вопросе. Затем я написал конструктор для класса RetailItem, который создает новый экземпляр и инициализирует элементы экземпляра. Затем я написал метод toString(), который отображает содержимое объекта RetailItem в «удобочитаемой» форме. Наконец, метод main(), который читает ваш текстовый файл (который я назвал "clothes.txt"), построчно - используя Scanner. Для каждой прочитанной строки код разбивает ее, используя разделитель, состоящий как минимум из одного символа пробела. (Я предполагаю, что вы еще не узнали о регулярных выражениях в java.) Затем я преобразовываю элементы массива String, возвращаемые методом split(), в соответствующие типы данных, которые требуются конструктору RetailItem. Затем я вызываю конструктор, создавая таким образом экземпляр класса RetailItem (как вы и просили), и печатаю созданный экземпляр.

import java.io.IOException;
import java.nio.file.Paths;
import java.util.Scanner;

public class RetailItem {
    private static final int FIELDS = 4;

    private int itemNumber;
    private String description;
    private int numInInventory;
    private double price;

    public RetailItem(int itemNumber, String description, int numInInventory, double price) {
        this.itemNumber = itemNumber;
        this.description = description;
        this.numInInventory = numInInventory;
        this.price = price;
    }

    @Override // java.lang.Object
    public String toString() {
        return String.format("%4d %-5s %2d %2.2f", itemNumber, description, numInInventory, price);
    }

    public static void main(String[] args) {
        try (Scanner file = new Scanner(Paths.get("clothes.txt"))) {
            while (file.hasNextLine()) {
                String record = file.nextLine();
                String[] fields = record.split("\\s+");
                if (fields.length == FIELDS) {
                    int itemNumber = Integer.parseInt(fields[0]);
                    String description = fields[1];
                    int numInInventory = Integer.parseInt(fields[2]);
                    double price = Double.parseDouble(fields[3]);
                    RetailItem item = new RetailItem(itemNumber, description, numInInventory, price);
                    System.out.println(item);
                }
            }
        }
        catch (IOException xIo) {
            xIo.printStackTrace();
        }
    }
}
0 голосов
/ 08 апреля 2020

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

Я делал что-то подобное раньше, может быть, это может быть полезно.

        Scanner fileScan;
        File babyNameFile = new File("yob2015.txt");

        try {
            fileScan = new Scanner(babyNameFile);
        } catch (FileNotFoundException e) {
            System.out.println("File does not exist");
            return;
        }

        String currentLine;
        int numberOfGirlsNames = 0;

        while (fileScan.hasNextLine()) {
            String[] values;
            currentLine = fileScan.nextLine();
            values = currentLine.split(",");
            if (values[1].equals("F")) {
                numberOfGirlsNames = numberOfGirlsNames+1;
            }
        }
        System.out.println("Number of female names was "+numberOfGirlsNames);
...