我有这个:
private ArrayList<ArrayList<Object>> models;
在构造函数中我有:
models = new ArrayList<ArrayList<Object>>();
稍后,我会做以下事情:
models.add(new ArrayList<Object>());
以及其他操作。
我想将外部ArrayList设置为具有固定大小的内容(Array,List),并且由于嵌套对象,我真的不知道如何编写声明,初始化,添加等。有人可以通过回答这个来节省我的时间吗?
答案 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
。