1

while ループで文字列値が取り込まれている 2 次元の ArrayList があります。BufferedReader値は、 を使用して読み取られ、 を使用して 1 次元の ArrayList に入れられる CSV ファイルから取得されStringTokenizerます。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();

正しい行数を返します。

2D 配列の行が while ループ内に取り込まれ、while ループの外に取り込まれないのはなぜですか?
while ループの外で 2D 配列にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

row.clear();外側のリストには、後で同じ内側のリストのコピーが多数含まれています。

new ArrayList<>()行ごとに作成する必要があり、クリアしないでください。

于 2012-12-13T01:51:48.593 に答える