我有这个:
private ArrayList<ArrayList<Object>> models;在构造函数中,我有:
models = new ArrayList<ArrayList<Object>>();后来,我做了这样的事情:
models.add(new ArrayList<Object>());以及其他行动。
我想将外部ArrayList设置为固定大小的东西(数组、列表),而且由于嵌套的对象,我真的不知道如何编写声明、初始化、添加等等。有人能帮我回答这个问题吗?
发布于 2018-01-02 10:32:44
您可以使用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初始化List的另一种方法:
List<ArrayList<Object>> models = Arrays.asList (Stream.generate (ArrayList::new).limit (10).toArray (ArrayList[]::new));发布于 2018-01-02 10:41:42
一种更详细但兼容泛型的方法是扩展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;
}
}发布于 2018-01-02 10:38:47
java中没有Array类,但是有一个普通的旧数组声明:
ArrayList<Object> [] array...问题是您无法像这样实例化它,因为数组不能是泛型的。
你真的在寻找Arrays.asList或者更好的某种ImmutableList。
https://stackoverflow.com/questions/48059294
复制相似问题