为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2023-09-06 16:06:10
我想将从 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);    }}这会打印出空列表“[]”。
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

两点:-

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

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


    }


}


查看完整回答
反对 回复 2023-09-06
?
白板的微信

TA贡献1883条经验 获得超3个赞

尝试将变量声明移到subwhile 块上。


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


查看完整回答
反对 回复 2023-09-06
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

你可以这样做


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;

}


查看完整回答
反对 回复 2023-09-06
  • 3 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信