Заполнение объекта с ошибкой возврата файла CSV - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть CSV-файл, который содержит следующую информацию:

Santa Catarina,Florianópolis,São José,Biguaçu,Palhoça
Rio grande do Sul,Porto alegre,,,
Paraná,Curitiba,Londrina,Ponta Grossa,

Каждые первые данные из каждой строки являются штатами, а следующие города являются соответствующими.

У меня есть два объекта: Штат и Город, Штат (Estado) имеет Имя и ArrayList городов, а Город (Cidade) имеет множество атрибутов.

Чтобы прочитать мой CSV, вот мой код:

BufferedReader r = new BufferedReader(new FileReader("C:\\Users\\Pedro Sarkis\\Desktop\\ex3.csv"));

ArrayList<Estado> estados = new ArrayList<>();
ArrayList<Cidade> cidade = new ArrayList<>();

// String estados2[];
int i = 1;
String line = r.readLine();
try {
    while (line != null) {
        //  System.out.println("Line " + i + ": " + line);
        String[] campos = line.split(",");

        for (int j = 1; j < campos.length; j++) {
            Cidade c = new Cidade();
            c.setNome(campos[j]);
            cidade.add(c);
        }

        Estado e = new Estado(campos[0], cidade);
        estados.add(e);

        cidade.clear();

        line = r.readLine();
        i++;
    }
} finally {
    r.close();
}

Проблема в том, что я просто не могу ограничить города соответствующими состояниями.

Я былтестирование с использованием .clear() для своего рода сброса моего списка после каждого while, но оно не работает, поскольку оно сбрасывает все мои прошлые данные, и без использования .clear() все мои штаты получают все города.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Каждый экземпляр Estado должен иметь новый Список. Если вы передаете один и тот же объект List каждой конструкции Estado, они все совместно используют один и тот же объект List. Вызов clear() не создает новый или другой объект List, он просто удаляет элементы из того же объекта List.

Есть два способа сделать это.

Первый подход: вы можете изменить класс Estado на использование объектно-ориентированной практики, известной как защитное копирование. Класс Estado будет копировать аргумент List, данный его конструктору, поэтому другой код не сможет измените экземпляр Estado, изменив Список. Таким образом, только вызов методов Estado может изменить экземпляр Estado. Это позволяет нам сказать, что класс Estado инкапсулирует своих данных, имея исключительный контроль над своим собственным состоянием.

public class Estado {
    private String state;

    private List<String> cities;

    public Estado(String state,
                  List<String> cities) {

        this.state = state;

        // Copying the List, so any later modifications cannot affect
        // this instance.
        this.cities = new ArrayList<>(cities);
    }
}

Второй подход: создать новый городской ArrayList для каждой прочитанной строки.

while (line != null) {

    String[] campos = line.split(","); 

    cidade = new ArrayList<>();

    // ...
0 голосов
/ 07 апреля 2019

Использование clear () в этом случае не сработает, так как предыдущие элементы в списке по-прежнему указывают на один и тот же объект. Таким образом, это также изменит значение предыдущих элементов. Измените свой код с

cidade.clear();

до

cidade = new ArrayList<>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...