Присвоение свойств объекту в Java из текстового файла

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

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

Section(String storytext, String choiceText, int choiceSections)

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

Car[] car = new Car[length/3];

for (int i = 0; i < length/3; i ++) // 
{
    int startReading = Integer.parseInt(inputFile.readLine());
    int endReading = Integer.parseInt(inputFile.readLine());
    int liter = Integer.parseInt(inputFile.readLine());
    car[i] = new Car (startKm, endKm, litre);
}

Однако мне кажется, что это сработает, мне нужно, чтобы мой цикл динамически обновлялся на основе нескольких критериев. #1 > Число в первой строке, которое является общим количеством объектов раздела, которые будут созданы. # 2 > Число в строке общего выбора, которое будет определять, сколько еще строк должен пройти считыватель строк, прежде чем остановиться и создать объект. Я совершенно не понимаю, как создать правильный цикл, который будет создавать мои объекты на основе этих критериев для этих текстовых файлов.

6 ‹ Количество «разделов» в игре

1 ‹ Номер секции (1)

Однажды вечером, готовя бутерброд с арахисовым маслом и джемом, вы обнаруживаете, что у вас закончилось клубничное варенье. ‹ Текст истории, связанный с разделом

2 ‹ Количество возможных вариантов

5 ‹ Выбор ниже ведет в этот раздел

Если вы обходитесь виноградным желе, нажмите здесь. ‹ Это один из вариантов

4 ‹ Выбор ниже ведет в этот раздел

Если вы идете в магазин, чтобы купить клубничное варенье, нажмите здесь. ‹ Это один из вариантов

2 ‹ Номер секции (2)

Вы приходите домой и начинаете делать свежий бутерброд с любимой приправой. Вы с любовью намазываете арахисовое масло и клубничный джем, слюнки текут от чудесного аромата. Не в силах больше сопротивляться, вы откусываете. Абсолютное блаженство окутывает вас, идеальное сочетание вкусов — каскад удивительности, наполняющий ваше сознание. ‹ Текст истории, связанный с этим разделом

0 ‹ Количество возможных вариантов

3 ‹ Номер секции (3)

Живот сразу начинает болеть. Боль пронзает живот, и вы сгибаетесь пополам, задыхаясь. Пол рушится, и темнота заволакивает ваше зрение. ‹ Текст истории, связанный с этим разделом

0 ‹ Количество возможных вариантов

4 ‹ Номер секции (4)

Вы бежите в продуктовый магазин и ищете свою любимую марку клубничного джема. Вы с удивлением обнаруживаете на полке рядом со знакомой банкой новый сорт рябины. ‹ Текст истории, связанный с этим разделом

2 ‹ Количество возможных вариантов

2 ‹ Выбор ниже ведет в этот раздел

Если вы покупаете клубничное варенье, нажмите здесь. ‹ Это один из вариантов

6 ‹ Выбор ниже ведет в этот раздел

Если вы покупаете новое варенье из полевых ягод, нажмите здесь. ‹ Это один из вариантов

5 ‹ Номер секции (5)

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

2 ‹ Количество возможных вариантов

3 ‹ Выбор ниже ведет в этот раздел

Если вы едите вонючий бутерброд, нажмите здесь. ‹ Это один из вариантов

4 ‹ Выбор ниже ведет в этот раздел

Если вы выбросите его в мусор и пойдете покупать варенье, нажмите здесь. ‹ Это один из вариантов

6 ‹ Номер секции (6)

Вы приходите домой и начинаете делать свежий бутерброд с новой захватывающей приправой. Вы с любовью намазываете арахисовое масло и варенье из лесных ягод, слюнки текут от чудесного аромата. Не в силах больше сопротивляться, вы откусываете. ‹ Текст истории, связанный с этим разделом

1 ‹ Количество возможных вариантов выбора // здесь пока неизвестен выбор.

3 ‹ Раздел выбора, в котором вы тоже ведете, 3 означает победу, поэтому на этом он заканчивается.


person Serkuto    schedule 19.05.2017    source источник
comment
Это законный вопрос, ребята, просто описание слишком длинное.   -  person Mr_and_Mrs_D    schedule 19.05.2017
comment
Да, я просто немного изменил формат, чтобы мои вопросы были вверху, а затем в текстовом файле, чтобы привлечь внимание людей. Это то, за что мне бы очень хотелось получить помощь, потому что я не могу ничего найти с помощью буферизованных считывателей или программ чтения файлов, подобных этому.   -  person Serkuto    schedule 19.05.2017


Ответы (1)


Это будет делать:

public class Main {

    public static void main(String[] args) throws IOException {
         try (BufferedReader br = new BufferedReader(new FileReader(
                "C:\\path\\to\\file"))) {
            String line = br.readLine().trim(); // may throw IOException
            int num_of_sections = Integer.parseInt(line);
            List<Section> sections = new ArrayList<>(num_of_sections);
            for (int j = 1; j <= num_of_sections; ++j) {
                line = _skip_empty(br);
                int section_number = Integer.parseInt(line);
                String section_text = _skip_empty(br);
                line = _skip_empty(br);
                int num_choices = Integer.parseInt(line);
                List<Choice> choices = new ArrayList<>(num_choices);
                for (int choice = 0; choice < num_choices; ++choice) {
                    line = _skip_empty(br);
                    int go_to_section = Integer.parseInt(line);
                    String choice_text = _skip_empty(br);
                    choices.add(new Choice(go_to_section, choice_text));
                }
                sections.add(new Section(section_number, section_text, choices));
            }
        }
    }

    private static class Section {
        private final int sectionNumber;
        private final String storyText;
        private final List<Choice> choices;

        Section(int sectionNumber, String storyText, List<Choice> choices) {
            this.sectionNumber = sectionNumber;
            this.storyText = storyText;
            this.choices = choices;
        }

        public String getStoryText() {
            return storyText;
        }

        public List<Choice> getChoices() {
            return choices;
        }

        public int getSectionNumber() {
            return sectionNumber;
        }
    }

    private static class Choice {
        private final int leadsToSection;
        private final String choiceText;

        Choice(int leadsToSection, String choiceText) {
            this.leadsToSection = leadsToSection;
            this.choiceText = choiceText;
        }

        public int getLeadsToSection() {
            return leadsToSection;
        }

        public String getChoiceText() {
            return choiceText;
        }
    }

    private static String _skip_empty(BufferedReader br) throws IOException {
        String line;
        do {
            line = br.readLine();
            if (line == null) return ""; // winning choice does that
            line = line.trim();
        } while (line.isEmpty());
        return line;
    }
}

Как видите, я изменил ваш класс Section, чтобы он принимал список вариантов — это более уместно.

person Mr_and_Mrs_D    schedule 19.05.2017
comment
Это именно то, что я искал, я действительно новичок в включении файлов в свои программы, поэтому то, как вы решили использовать буферизованный ридер, имеет гораздо больше смысла, спасибо. - person Serkuto; 20.05.2017
comment
В основном да, я понимаю все ваши реализации и то, как вы решили перемещаться по текстовому файлу, что гениально. Кроме того, создание метода для пропуска пробелов в файле или просто для чтения строки — огромная экономия времени. Однако, когда я печатаю свой массив, такой как разделы, после запуска метода, он печатается полностью как нули? Я знаю, что путь к файлу правильный, поскольку я помещаю строки печати в каждую часть цикла, и он практически читает мне весь файл. - person Serkuto; 21.05.2017
comment
У меня он печатается нормально - пожалуйста, убедитесь, что вы используете точно такой же код. Я думаю, что дал вам достаточно кода, чтобы взять его отсюда;) - конечно, вам нужны методы toString и т. д. Также формат файла должен быть точно таким же, как в вопросе - person Mr_and_Mrs_D; 21.05.2017