Java:将一个列表添加到另一个列表而不复制引用

Java: add a list to another list without copy the reference

我想让从 csv 中读取的每一行都作为 sub_list 并将这样的 sub_list 添加到 master_list。

所以它会是这样的:

[[第 1 行] [第 2 行] ....[最后一行]]

如何确保 master_list 中添加的 sub_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);

    }

}

这会打印出空列表“[]”。

尝试将 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);

两点:-

1 - 如下更改您的主列表。你不应该创建通用列表(原始类型)。如果您将列表创建为原始类型,您将能够输入任何数据类型。它会产生问题,因为可以有多个数据类型列表。

2 - 当您进入 while 循环时,create/assign 对子列表的新引用,然后将其添加到主列表。

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);

    }

}

你可以做到

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;
}