【问题标题】:Why can't I access elements of 2D ArrayList?为什么我不能访问 2D ArrayList 的元素?
【发布时间】:2012-12-13 01:47:13
【问题描述】:

我有一个二维 ArrayList,它在 while 循环中填充了字符串值。这些值来自使用BufferedReader 读取的CSV 文件,然后使用StringTokenizer 放入一维ArrayList。 1D ArrayList 在 while 循环中添加到 2D ArrayList。

我的问题是我无法在 while 循环之外访问 2D 数组的元素。从下面的代码可以看出:

public String[][] readInCSV(String mg) {


    List<List<String>> twoDim = new ArrayList<List<String>>();
    List<String> row = new ArrayList<String>();
    try {

        BufferedReader CSVFile = new BufferedReader(new FileReader("C:\\minuteTest.csv"));
        String dataRow="";
        int y=0;

        while ((dataRow = CSVFile.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(dataRow, ",");


            while(st.hasMoreTokens()){

                row.add(st.nextToken());

            }
            System.out.println("row: " + row.get(2));
            twoDim.add(row);
            System.out.println("twoDimTest: " + twoDim.get(y).get(2) + "  y: " + y);
            row.clear();
            y++;
        }

        for(int x=0; x<twoDim.size(); x++){

            System.out.println("twoDim: " + twoDim.get(x).size());
        }
        CSVFile.close();

    } 
    catch (FileNotFoundException e1) {
        System.out.println("file not found: " + e1.getMessage());
    } 
    catch (IOException e1) {
        System.out.println("could not read file: " + e1.getMessage());
    }


    return strArray;
}

"twoDimTest" 准确地打印出"row" 在 while 循环中所做的事情,但 "twoDim" 在 for 循环中打印出 0。如果我尝试:

twoDim.get(0).get(2);

它返回一个 IndexOutOfBoundsException。如果我尝试:

twoDim.size();

它返回正确的行数。

为什么我的二维数组的行填充在 while 循环中,而不是在 while 循环之外?
如何在 while 循环之外访问我的二维数组?

【问题讨论】:

标签: java string arraylist


【解决方案1】:

您的外部列表包含同一内部列表的许多副本,之后您 row.clear();

你需要为每一行创建一个new ArrayList&lt;&gt;(),而不是清除它。

【讨论】:

  • 太好了,效果很好。我没有意识到如果我更改了内部列表,这些更改将反映在外部列表中,但我想这是因为它们指向相同的内存空间......?无论如何,谢谢 SLaks
  • @dterlip 没错!您只需创建一行并将其多次添加到“外部”数组列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多