3

これは本当に些細なことのように思えますが、2D String ArrayList を新しい 2D String ArrayList データ構造全体にコピーするのに問題があります。

public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) {

    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>();

    for(int i = 0; i < input.size(); i++) {
        ArrayList<String> line = input.get(i);  // Issue here?
        for(int j = 0; j < input.get(i).size(); j++) {
            line.set(j, input.get(i).get(j));
        }
    }
    return copy;
}

浅いコピーを作成するつもりはありません。ArrayList 全体を反復処理して新しいものにコピーしようとしています。行 ArrayList で行を正しく初期化していないように感じますが、ArrayList データ構造の要点は、サイズを初期化せずにデータを追加できることだと思いましたか?

最初の行は正しくコピーされているように見えますが、後続の行を追加しようとすると範囲外にインデックスが作成されます。

4

2 に答える 2

3

それ自体のArrayList内部を作成することを忘れています。ArrayList

public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) {

    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>();

    for(int i = 0; i < input.size(); i++) {
        ArrayList<String> line = new ArrayList<String>();

        for(int j = 0; j < input.get(i).size(); j++) {
            line.add(input.get(i).get(j));
        }

        copy.add(line);
    }
    return copy;
}
于 2013-10-15T04:18:10.187 に答える
2
public static ArrayList<ArrayList<String>> copy(ArrayList<ArrayList<String>> input) {
    ArrayList<ArrayList<String>> copy = new ArrayList<ArrayList<String>>(input.size());
    for(int i = 0; i < input.size(); i++) {
        ArrayList<String> line = input.get(i);
        copy.set(i, new ArrayList<String>(line.size())); // add internal array initialization
        for(int j = 0; j < line.size(); j++) {
            copy.get(i).set(j, line.get(j)); // actually copy value into new array
        }
    }
    return copy;
}
于 2013-10-15T04:19:20.910 に答える