Java: добавить список в другой список без копирования ссылки - PullRequest
0 голосов
/ 29 сентября 2019

Я хочу, чтобы каждая строка читалась из csv как sub_list и добавляла такой sub_list в master_list.

enter image description here

так что это будет примерно так:

[[строка 1] [строка 2] .... [последняя строка]]]

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CSVReader {

    public static void main(String[] args) {

        String csvFile = "E:\\country.csv";
        String line = "";
        String cvsSplitBy = ",";
        List<String> sub = new ArrayList<String>();
        List<List> master = new ArrayList<List>();

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

            while ((line = br.readLine()) != null) {

                // use comma as separator
                String[] country = line.split(cvsSplitBy);
                sub.add(line);
                master.add(sub);
//              System.out.println(sub);
                sub.remove(0);

//                System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]");

            }

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

        System.out.println(master);

    }

}

это выводит пустой список "[]".

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

Две точки: -

1 - Измените свой основной список, как показано ниже.Вы не должны создавать общий список (тип Raw).Если вы создадите список в виде необработанного типа, вы сможете ввести любой тип данных ввода.Это создаст проблему, так как может быть список нескольких типов данных.

2 - при входе в цикл while создайте / назначьте новую ссылку на подсписок, а затем добавьте ее в мастер.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CSVReader {

    public static void main(String[] args) {

        String csvFile = "E:\\country.csv";
        String line = "";
        String cvsSplitBy = ",";
        List<String> sub = new ArrayList<String>();
        List<List<String>> master = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

            while ((line = br.readLine()) != null) {

                // use comma as separator
                String[] country = line.split(cvsSplitBy);
                sub = new ArrayList<String>();
                sub.add(line);
                master.add(new ArrayList<String>(sub));
//              System.out.println(sub);
                sub.remove(0);

//                System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]");

            }

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

        System.out.println(master);

    }

}
1 голос
/ 29 сентября 2019

Попробуйте переместить объявление переменной sub в блок while.

    String csvFile = "E:\\country.csv";
        String line = "";
        String cvsSplitBy = ",";
        List<List> master = new ArrayList<List>();

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

            while ((line = br.readLine()) != null) {

                // use comma as separator
                String[] country = line.split(cvsSplitBy);
                List<String> sub = new ArrayList<String>();
                sub.add(line);
                master.add(sub);
//              System.out.println(sub);
//              sub.remove(0);

//                System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]");

            }

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

        System.out.println(master);
0 голосов
/ 29 сентября 2019

Вы можете сделать это

public static List<String[]> getTestData(String fileName) {
    List<String[]> records = new ArrayList<String[]>();
    try {
        String record;
        BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
        while ((record = file.readLine()) != null) {
            System.out.println(record);
            String fields[] = record.split(",");
            records.add(fields);
        }
        file.close();
        return records;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
...