我想知道如何初始化一个具有无限量预定义值的ArrayList,因此我可以访问任意索引的元素并更新其值。
例如,ArrayList testArrayList
将使用所有int
值0
启动,我可以立即使用testArrayList.set(123, 15)
将ArrayList中的第124个元素设置为{{ 1}}而不是获得一个超出范围的异常。当我执行15
之类的查询时,我会得到预定义的值testArrayList.get(99999)
。
我一直在尝试初始化ArrayList,然后使用for循环向其添加0
,但我必须决定初始ArrayList应该有多大。如果我创建了一个ArrayList,那么立即向其添加100 0
个,在添加0
s之前我无法对其进行.get(200)
。
我正在寻找ArrayList的可能吗?如果没有,你会推荐一些替代解决方案吗?
谢谢。
编辑:我想要一个List的原因是我希望能够按顺序遍历它。我正在创建一个简单的类似日历的程序,我可以在其中添加/检索/修改任意“日期”的“注释”,但也可以打印出给定特定时段的每个“日”的注释。
答案 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
,你可以对它进行子类化并覆盖get
和set
,以便它们检查列表是否足够大以用于索引,如果不是,把它填到它的位置。
对于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内置库中没有这样的东西。
选项空间:
答案 3 :(得分:0)
隐藏对自定义方法后面的列表的访问权限。防御性地获取索引,如果列表没有足够的项目,则将默认项目添加到列表中,直到达到所需的索引。如果下一个索引的大小小于或等于,则获取该索引。其他重复。
没有默认结构,默认值不受限制(效率不高)。通过如上所述隐藏列表,您可以根据需要(或您认为需要)获得尽可能多的项目。