来自ArrayList <arraylist <object>&gt;到固定大小的数组/列表

时间:2018-01-02 10:28:28

标签: java arrays arraylist

我有这个:

private ArrayList<ArrayList<Object>> models;

在构造函数中我有:

models = new ArrayList<ArrayList<Object>>();

稍后,我会做以下事情:

models.add(new ArrayList<Object>());

以及其他操作。

我想将外部ArrayList设置为具有固定大小的内容(Array,List),并且由于嵌套对象,我真的不知道如何编写声明,初始化,添加等。有人可以通过回答这个来节省我的时间吗?

3 个答案:

答案 0 :(得分:4)

您可以使用Arrays.asList()创建固定大小的List

示例:

大小为3的List,使用空值初始化:

List<ArrayList<Object>> models = Arrays.asList (null,null,null);

大小为3的List,使用非空值初始化:

List<ArrayList<Object>> models = Arrays.asList (new ArrayList<Object> (),new ArrayList<Object> (),new ArrayList<Object> ());

大小为10的List,使用空值初始化:

List<ArrayList<Object>> models = Arrays.asList ((ArrayList<Object>[])new ArrayList[10]);

请注意,固定大小的列表不支持add操作。您必须改为使用models.set(index,new ArrayList<Object>())

编辑:

以下是使用List s初始化Stream的另一种方式:

List<ArrayList<Object>> models = Arrays.asList (Stream.generate (ArrayList::new).limit (10).toArray (ArrayList[]::new));

答案 1 :(得分:2)

稍微更详细但通用兼容的方式是扩展AbstractList

需要覆盖的方法在Javadoc中描述:

  

要实现不可修改的列表,程序员只需要扩展此类并提供get(int)size()方法的实现。

     

要实现可修改的列表,程序员必须另外覆盖set(int, E)方法(否则会抛出UnsupportedOperationException)。

因此,实现这三种方法,委托给ArrayList

class FixedSizedList<T> extends AbstractList<T> {
  private final List<T> delegate;

  FixedSizedList(int size) {
    delegate = new ArrayList<>(Collections.nCopies(size, null));
  }

  public T get(int i) { return delegate.get(i); }
  public int size() { return delegate.size(); }
  public T set(int i, T e) { return delegate.set(i, e); }
}

或者,就此而言,只需使用数组:

class FixedSizedList<T> extends AbstractList<T> {
  private final Object[] array;

  FixedSizedList(int size) {
    array = new Object[size];
  }

  public T get(int i) { return (T) array[i]; }
  public int size() { return array.length; }
  public T set(int i, T e) {
    T old = (T) array[i];
    array[i] = e;
    return old;
  }
}

答案 2 :(得分:0)

java中没有Array类,但是有一个普通的旧数组声明:

ArrayList<Object> [] array...

问题是你无法像这样实例化它,因为数组不能是通用的。

你真的在寻找Arrays.asList或更好的ImmutableList