伙计们,将元素从array
复制到Arraylist
的技术是什么?
public DenseBoard(T[][] x, T fillElem){
ArrayList<ArrayList<T>> myBoard = new ArrayList<ArrayList<T>>();
for(int i = 0; i < x.length; i++){
for(int j = 0; j < x[0].length; j++){
myBoard.get(i).add(j); //<<------ getting error!
}
}
}
答案 0 :(得分:1)
您需要在外部循环中初始化myBoard的每个成员:
public DenseBoard(T[][] x, T fillElem){
ArrayList<ArrayList<T>> myBoard = new ArrayList<ArrayList<T>>();
for(int i = 0; i < x.length; i++){
myBoard.add(new ArrayList<T>); //Gotta add something to stick stuff in
for(int j = 0; j < x[0].length; j++){
myBoard.get(i).add(j); //<<------ no more error?
}
}
}
由于myBoard是Ts的ArrayLists的ArrayList,我们需要给它一个放置T的地方。最初,myBoard看起来像这样:
[] <-- empty ArrayList
所以我们给它一个地方来为每一行放置数据,比如这个
myBoard.add(new ArrayList<T>);
现在看起来像
[ [] ] <--- ArrayList with an empty ArrayList in it, ready to accept T's
我们添加一些T,最后得到这个
[ [T1, T2, T3] ].
在下一次迭代中,我们最终会得到像这样的东西
[ [T1, T2, T3], [T4, T5, T6] ]
希望能够解决问题。
答案 1 :(得分:1)
您收到错误是因为您正在尝试get()
来自ArrayList
但尚未插入任何值的值。按照你的方式做,这是正确的代码:
ArrayList<ArrayList<T>> myBoard = new ArrayList<>();
for(int i = 0; i < x.length; i++){
ArrayList<T> values = new ArrayList<>();
for(int j = 0; j < x[0].length; j++){
values.add(x[i][j]);
}
myBoard.add(values);
}
只需使用以下功能:
Arrays.asList(T...a)
在您的情况下,它将完成:
ArrayList<T> myBoard = new ArrayList<>();
for(T[] arr : x){
myBoard.add(Arrays.asList(arr));
}
diamond operator <>
使代码更具可读性for-each
语句答案 2 :(得分:0)
灵感来自post。
new ArrayList<Item>(Arrays.asList(array))
从输入数组中创建新的ArrayList
个Item
元素。对于二维。在这种情况下,您尝试了这个:
public DenseBoard(T[][] x, T fillElem){
ArrayList<ArrayList<T>> myBoard = new ArrayList<ArrayList<T>>();
for(int i = 0; i < x.length; i++){
for(int j = 0; j < x[0].length; j++){
myBoard.get(i).add(j); //<<------ getting error!
}
}
}
问题在于抛出错误的行假设您有ArrayList
ArrayList
,但您尝试引用的内部元素未初始化。这应该是一个修复:
public DenseBoard(T[][] x, T fillElem){
ArrayList<ArrayList<T>> myBoard = new ArrayList<ArrayList<T>>();
for(int i = 0; i < x.length; i++){
myBoard.add(new ArrayList<T>(Arrays.asList(x[i])));
}
//Do something with myBoard
}