Как я могу прочитать текстовый файл и указать, к какому типу объектов он относится Java? - PullRequest
0 голосов
/ 28 февраля 2020

Итак, у меня есть текстовый файл, в котором много собак и кошек. Это выглядит примерно так:

Cat Bones 60 150 Orange 3006
Dog Bruce 170 200 210 White 1530
Dog Bones 130 145 200 Black 0864
Cat Mog 70 140 Black 6037
...

Как видите, всем собакам присваивается дополнительный int, а кошкам нет. Это одинаково для всех собак и кошек в списке. Я хочу сделать объекты для каждой собаки и кошки и хранить их в одном массиве. Я хочу сделать это с помощью сканера и с помощью функции in.next () и ее вариантов, таких как in.nextInt (). Основная проблема, с которой я столкнулся, заключается в том, что я не могу сказать, какая строка является собакой, а какая кошкой, поэтому это вызывает проблемы с моим in.next (). Собаки имеют на 1 целое число больше, чем кошки, поэтому я должен найти способ идентифицировать собак от кошек и затем установить переменные, которые будут переданы в конструктор для собаки / кошки.

Конструктор собак выглядит следующим образом

Public Dog(String name, int x, int y, int z, String colour, int ID) {...}

Конструктор cat выглядит следующим образом

Public Cat(String name, int x, int y, String colour, int ID) {...}

Я пытался сделать

String objectType = in.next();
String name = in.next();
int x = in.nextInt();
int y = in.nextInt();
if(objectType == "Dog") {
    int z = in.nextInt();
}
String colour = in.next();
int ID = in.next();

if(objectType == "Dog") {
    Dog newDog = new Dog(name, x, y, z, colour, ID);

Это не работает. Z имеет красный цвет и «не может разрешить символ z». Любой совет будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Мне кажется, что это упражнение в объектно-ориентированном программировании, то есть в иерархиях классов, поскольку класс Cat и класс Dog имеют общих членов. На самом деле они имеют одинаковые элементы, а Dog имеет дополнительный элемент, а именно z.

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

Следовательно, я бы создал родительский класс HousePet, поскольку кошки и собаки, как правило, являются домашними питомцами, в которых содержатся члены, общие для Cat и Dog, и оба эти класса расширяют класс HousePet.

Затем вы просто читаете файл построчно. Для каждой строки вы разделяете ее на один пробел. Если линия состоит из шести частей, это Cat, в противном случае это Dog. Вы вызываете соответствующий конструктор в зависимости от количества частей в прочитанной строке.

Поскольку вам необходимо добавить и Cat s, и Dog s в один и тот же список, создайте List из HousePet.

Вот код.

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

public class CatsDogs {

    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(new File("catsdogs.txt"))) {
            List<HousePet> pets = new ArrayList<>();
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String[] parts = line.split("\\s");
                HousePet pet;
                if (parts.length == 6) {
                    pet = new Cat(parts[1],
                                  Integer.parseInt(parts[2]),
                                  Integer.parseInt(parts[3]),
                                  parts[4],
                                  Integer.parseInt(parts[5]));
                }
                else {
                    pet = new Dog(parts[1],
                                  Integer.parseInt(parts[2]),
                                  Integer.parseInt(parts[3]),
                                  Integer.parseInt(parts[4]),
                                  parts[5],
                                  Integer.parseInt(parts[6]));
                }
                pets.add(pet);
            }
        }
        catch (IOException xIo) {
            xIo.printStackTrace();
        }
    }
}

abstract class HousePet {
    protected String name;
    protected int x;
    protected int y;
    protected String colour;
    protected int id;

    protected HousePet(String name, int x, int y, String colour, int id) {
        this.name = name;
        this.x = x;
        this.y = y;
        this.colour = colour;
        this.id = id;
    }
}

class Cat extends HousePet {
    public Cat(String name, int x, int y, String colour, int id) {
        super(name, x, y, colour, id);
    }
}

class Dog extends HousePet {
    private int z;

    public Dog(String name, int x, int y, int z, String colour, int id) {
        super(name, x, y, colour, id);
        this.z = z;
    }
}
0 голосов
/ 28 февраля 2020

Вы должны узнать о «сферах». Если вы создаете z внутри условия if, оно не будет доступно вне этого блока. Поэтому создайте его вне условия if, тогда оно будет работать.

String objectType = in.next();
String name = in.next();
int x = in.nextInt();
int y = in.nextInt();
int z;
if("Dog".equals(objectType)) {
    z = in.nextInt();
}
String colour = in.next();
int ID = in.next();

if("Dog".equals(objectType)) {
    Dog newDog = new Dog(name, x, y, z, colour, ID);
}

Также оператор == работает только с простыми типами (int, long, float, boolean), но не с объектами (Integer, Long , Float, String, ...). Для объектов вы должны использовать метод equals ().

Оператор ==, используемый для объектов, будет сравнивать идентичность (это адрес в ОЗУ) объектов, а не их значения.

...