2017-08-15 44 views
0

我想知道如何初始化具有无限量预定义值的ArrayList,以便可以访问任意索引的元素并更新其值。带有无限预定义值的ArrayList

例如,ArrayList的testArrayList将与所有int价值0开始,我可以立即使用testArrayList.set(123, 15)在ArrayList中的124元素设置为15,而不是得到一个出界异常的。当我执行像testArrayList.get(99999)这样的查询时,我会得到预定义的值0

我一直在尝试初始化ArrayList,然后使用for循环向它添加0 s,但我必须决定初始ArrayList应该有多大。如果我创建了一个ArrayList,然后立即添加100 0 s,那么在添加另一个0 s之前,我无法对其执行.get(200)

是我正在寻找可能与ArrayList?如果不是,你会推荐一些替代解决方案吗?

谢谢。

编辑:我想要一个列表的原因是我希望能够按顺序遍历它。我正在制作一个简单的日历式程序,我可以在其中添加/检索/修改任意“日期”的“笔记”,但也可以打印出特定时间段内每个“日”的笔记。

+1

也许你可以描述你试图解决的问题,这个问题促使你问这个问题。 –

+0

为什么你需要一个有无限预定义值的列表? – hamena314

+2

实现您自己的ArrayList,并将您的需求添加到方法 – azro

回答

1

它听起来不像ArrayList(或任何种类的List)是真的想要你想要的。这听起来像你想要一个Map

但是,如果你想把它当作一个ArrayList,你可以继承它,并覆盖getset这样他们检查列表是否是该指数足够大,如果没有,就补到这是一点。

松散,为set

@Override 
public E set(int index, E element) { 
    if (this.size() <= index) { 
     this.ensureCapacity(index + 1); 
     for (int n = this.size(); n <= index; ++n) { 
      this.set(n, 0); 
     } 
    } 
    return super.set(index, element); 
} 

,再次,它似乎是一个Map可能是一个更好的选择。

4

你不想为了填充99999“个索引创建ArrayList,因为你必须0填充指数以99998首先,这是一种浪费。

A HashMap<Integer,Integer>是一个更好的选择,因为您只填充您关心的索引。

A HashMapInteger键可以被认为就好像您将您的“稀疏ArrayList”的索引映射到一个小数组中,这可以减少存储需求,同时保持预期的插入和查找时间不变。

例如:

Map<Integer,Integer> map = new HashMap<>(); 
int value = map.getOrDefault(99999,0); // this will return 0 if the Map has no value 
             // for the key 99999 
map.put (99999, value + 1); 

编辑:看到你的迭代顺序的要求,你可以使用TreeMap<Integer,Integer>代替HashMap<Integer,Integer>。这种方式遍历键将始终按照它们的数字顺序进行迭代。

+0

谢谢,我将尝试使用TreeMap。 – gcarol

0

您正在问如何填补一个人口稀少的数组。

据我所知,Java内置库中没有这样的东西。

选项空间:

  • 使用的另一种数据结构,即更适合“稀疏”的内容。有123个空插槽有什么意义?当你只有一个真正的内容插槽......一个地图可能更适合你的需求。
  • 你总是可以实现自己的清单版本,其中“创建”所有这些空槽点播
0

躲在一个自定义的方法访问列表。如果列表中没有足够的项目,请在列表中添加默认项目,直到达到所需的索引为止。如果下一个索引小于或等于该大小,则获取该索引。否则重复。

没有无限的默认值的默认结构(它不会非常有效)。通过隐藏如上所述的列表,您只需要尽可能多的项目(或按照您的需要)。