具有无限预定义值的ArrayList

时间:2017-08-15 11:19:34

标签: java loops arraylist data-structures

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

例如,ArrayList testArrayList将使用所有int0启动,我可以立即使用testArrayList.set(123, 15)将ArrayList中的第124个元素设置为{{ 1}}而不是获得一个超出范围的异常。当我执行15之类的查询时,我会得到预定义的值testArrayList.get(99999)

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

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

谢谢。

编辑:我想要一个List的原因是我希望能够按顺序遍历它。我正在创建一个简单的类似日历的程序,我可以在其中添加/检索/修改任意“日期”的“注释”,但也可以打印出给定特定时段的每个“日”的注释。

4 个答案:

答案 0 :(得分:4)

您不想创建ArrayList,因为为了填充99999'索引,您必须将索引0填充到99998首先,这是浪费。

HashMap<Integer,Integer>是更好的选择,因为您只填充您关注的指数。

具有HashMap密钥的Integer可以被认为是将“稀疏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>。这种方式迭代键将始终根据其数字顺序。

答案 1 :(得分: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可能是更好的选择。

答案 2 :(得分:0)

您正在询问如何动态填充稀疏填充的数组。

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

选项空间:

  • 使用另一种更适合“稀疏”内容的数据结构。有123个空插槽有什么意义?如果您只有一个包含真实内容的插槽......地图可能更适合您的需求。
  • 您可以随时实施自己的List版本,“按需”“创建”所有空插槽

答案 3 :(得分:0)

隐藏对自定义方法后面的列表的访问权限。防御性地获取索引,如果列表没有足够的项目,则将默认项目添加到列表中,直到达到所需的索引。如果下一个索引的大小小于或等于,则获取该索引。其他重复。

没有默认结构,默认值不受限制(效率不高)。通过如上所述隐藏列表,您可以根据需要(或您认为需要)获得尽可能多的项目。