从ArrayList<ArrayList<Object>>转换为固定大小的数组/列表

5

我有这个:

private ArrayList<ArrayList<Object>> models;

在构造函数中我有以下代码:

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

后来,我做的事情包括:

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

以及其他操作。

我想将外部ArrayList转换为具有固定大小的东西(数组,列表),由于嵌套对象,我真的不知道该如何编写声明、初始化、添加等。有人可以帮我回答一下,节省我的时间吗?


1
你的意思是限制它的大小吗?因为如果它是固定大小的,models.add 将会失败。 - Andy Turner
1
ArrayList的大小是可变的,而数组的大小是固定的。你是什么意思? - Eugene
是的,类似这样:Array<ArrayList<Object>> models。我知道外层“层”的确切大小。 - John
ArrayList<Object>[] array - Eugene
@JohnZobolas,你可以通过扩展AbstractList来创建符合你需要的任何要求的List - Andy Turner
显示剩余2条评论
3个回答

6
你可以使用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,初始值为 null:

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

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

编辑:

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

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

一旦你从列表中获取了列表,就无法修改它。 - Suresh Atta
@ꜱᴜʀᴇꜱʜᴀᴛᴛᴀ 你可以替换元素(就像你可以替换数组中的元素一样),但不能添加或删除元素。 - Eran
也许我错了。我的理解是,他想声明一个大小为X的列表,然后其他人就不能再添加超过X大小的内容了。 - Suresh Atta
1
@Zachary,你可以做类似于你建议的事情。我编辑了答案。 - Eran
当我创建初始化时,我会得到这个错误提示:“类型安全:从ArrayList[]到ArrayList<Object>[]的未经检查的转换”。这样可以吗? - John
显示剩余12条评论

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;
  }
}

@Eugene 不,它不会。这就是关于扩展 AbstractList 的事情:它会为所有它没有要求你重写的方法做正确的事情。 - Andy Turner
@Eugene,你在什么时候可以通过抛出异常来添加元素? - Andy Turner
@Eugene 这是一个固定大小的列表:它永远不会保持零个元素,除非你构造它以具有零个元素。如果你用10个元素构造它,它最初存储10个空元素。 - Andy Turner
1
哦天啊!我完全忽略了构造函数中的Collections.nCopies(size, null)。:| 将删除注释。 - Eugene

0

Java中没有Array类,但有普通的数组声明:

ArrayList<Object> [] array...

问题在于你不能像这样实例化它,因为数组不能是泛型。

你真正需要的是 Arrays.asList 或更好的 ImmutableList


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接