如何将元素从`2d array`复制到'Arraylist`?

时间:2015-09-05 04:36:30

标签: java arrays arraylist

伙计们,将元素从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!
          }
      }
  }

3 个答案:

答案 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));
}
  1. 尝试使用diamond operator <>使代码更具可读性
  2. 不要重新发明轮子,使用至少由核心库提供的实用程序
  3. 尽可能使用for-each语句

答案 2 :(得分:0)

灵感来自post

new ArrayList<Item>(Arrays.asList(array))

从输入数组中创建新的ArrayListItem元素。对于二维。在这种情况下,您尝试了这个:

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
}