从 ArrayList<ArrayList<Object>> 到 fixed size array/list



>我有这个:

private ArrayList<ArrayList<Object>> models;

在构造函数中,我有:

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

后来,我做了这样的事情:

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

以及其他操作。

我想将外部 ArrayList 设置为具有固定大小(数组、列表(的东西,由于嵌套对象,我真的不知道如何编写声明、初始化、加法等。有人可以通过为我回答这个问题来节省我的时间吗?

您可以使用

Arrays.asList()创建固定大小的List

例子:

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

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,使用 null 值初始化:

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

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

编辑:

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

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

一种稍微冗长但通用兼容的方法是扩展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;
  }
}

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

ArrayList<Object> [] array...

问题是您将无法像这样实例化它,因为数组不能是泛型的。

您真的在寻找Arrays.asList或更好的某种ImmutableList

最新更新