Java:存储到ArrayList的任意索引的最佳方式



我知道我不能将值存储在尚未使用的ArrayList的索引中,即小于大小。换句话说,如果myArrayList.size()是5,那么如果我尝试进行

myArrayList.set(10, "Hello World") 

我会得到一个界外错误。但我的应用程序需要这个。除了在每个中间插槽中存储null的循环之外,还有更优雅的方法吗?

在我看来:

  • 此行为在Vector中相同
  • 如果我需要能够随机访问(即位置X处的元素),那么我的选择是Vector和ArrayList
  • 我可以使用HashMap并将索引用作键,但这确实效率很低

那么,对于看似常见的情况,有什么优雅的解决方案呢。我一定是错过了什么。。。

我可以使用HashMap并将索引用作键,但这确实效率很低。

取决于。如果使用的索引非常稀疏,那么使用Map可能会更好。如果这些指数往往紧密相连,我认为没有比用零填充更好的方法了。只需为它写一个实用函数,你就可以反复使用它,而不是在你需要的地方重复循环,比如这样:

private void padTo(List<?> list, int size) {
    for (int i=list.size(); i<size; i++)
        list.add(null);
}

您可以使用TreeMap<key, value>,它按自然顺序由value排序。

在这里,您可以将值作为索引。您可以插入任何值,它不需要按顺序排列。这似乎是最简单的解决方案。

您可以使用Map<Integer, MyClass>。具体来说,如果使用HashMap,它也将是O(1)——尽管它将比ArrayList慢。

听起来你想要一个正则数组:

  • 您想要随机访问
  • 你想指定一些大尺寸

如果你肯定要使用列表而不是映射,那么最好重写arraylist的add和set方法,先在索引中放一个null。没有其他更好的方法IMO

HashMap的效率可能比你想象的要低得多,试试吧。否则,我想不出比循环和填充null更优雅的方法了。如果您至少想要展示的优雅,那么您可以始终将ArrayList子类化,并添加一个expandingSet(position,value)方法来隐藏所有的循环等等。也许这不是一个选择?如果不只是在其他地方有一个实用方法,但这不是很好的imho,尽管它也可以与其他类型的列表一起使用,我想。。。

也许包装器类是两全其美的,或者它只会产生不必要的开销。。。

如果你正在寻找一个稀疏数组(其中大多数索引都是空的),那么某种类型的Map(可能是HashMap)将是你的最佳选择。任何数组式的解决方案都将被迫为所有空索引保留空间,这不是很节省空间,而HashMap对于大多数正常用途来说足够快。

如果最终将数组填充到某个n,则需要在循环中添加null以获得所需的索引。您可以通过给它一个最终要存储的元素数量的初始容量来提高效率(这可以防止ArrayList需要调整大小)。new ArrayList(n)会正常工作。不幸的是,除了在制作时在循环中添加内容外,没有简单的方法可以让它达到一定的大小

最新更新