来自ArrayList >到固定大小的数组/列表

问题描述 投票:3回答:3

我有这个:

private ArrayList<ArrayList<Object>> models;

在我的构造函数中:

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

后来,我做的事情如下:

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

以及其他操作。

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

java arrays arraylist
3个回答
4
投票

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

例子:

一个大小为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>())

编辑:

这是使用Lists初始化Stream的另一种方法:

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

2
投票

稍微冗长 - 但通用兼容的方式 - 这样做是为了扩展AbstractList

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

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

要实现可修改的列表,程序员必须另外覆盖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;
  }
}

0
投票

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

ArrayList<Object> [] array...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.