是否有类似List
的类似数组?
我希望能够预定义List
的绝对大小,因此如果我得到一个值,那么未在其中定义但其索引位于大小的所有内容应为null
。我还想覆盖空值,如果我使用add()
方法就像已经实现的那样,或者我是否必须自己制作?
我已经尝试了ArrayList
s,但是如果我得到的索引值I小于容量但不小于该值,则会抛出IndexOutOfBoundsException
。
答案 0 :(得分:1)
据推测,这种结构有一些用途,需要它是List而不是数组。
最像表现形式的结构是数组。使用它,但在需要结构的List视图的上下文中,使用Arrays.asList。
答案 1 :(得分:1)
是的,由于您的特殊要求,您确实需要自己的实施:get
超出当前大小并返回null
。普通数组和任何List
实现都没有这样的语义。
您需要与ArrayList
非常相似的内容,因此从中扩展可能需要付费,覆盖get
以更改size
和capacity
之间的索引行为。< / p>
您也可以选择从AbstractList
开始,这将通过实施所有List
接口方法来帮助您,这些接口方法可以根据基本操作的核心子集进行定义。
答案 2 :(得分:1)
您似乎需要一个类似JavaScript的数组。你可以做的是从ArrayList
派生,重载容量构造函数,如果index大于一个大小,则返回null:
static class JSLikeArray<E> extends ArrayList<E> {
public JSLikeArray(int initialCapacity) {
super(initialCapacity);
}
@Override
public E get(int index) {
if (index >= size()) return null;
return super.get(index);
}
@Override
public E set(int index, E element) {
int l = index + 1;
for (int i = size(); i < l; i++) {
add(null);
}
super.set(index, element);
return element;
}
}
public static void main(String[] args) {
JSLikeArray<Integer> array = new JSLikeArray<Integer>(10);
array.set(3, 3);
System.out.println("array before add: " + array);
System.out.println("array.get(10): " + array.get(10));
array.add(4);
System.out.println("array after add: " + array);
}
打印:
array before add: [null, null, null, 3]
array.get(10): null
array after add: [null, null, null, 3, 4]
答案 3 :(得分:0)
ArrayList<String> a = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
a.add(i, null);
}
a.add(5, "string");
这将创建一个大小为20的ArrayList
,其中包含null
个。方法add(int index, String element)
确实使用给定元素更新给定索引上的null
。
但是,您不能再使用简单的add(String)
方法,因为这只会添加第21个(依此类推)元素。我认为你不能告诉List
不再接受价值观。这就是为什么创建它们的原因,这样你就可以为它添加值而不必关心它们的大小...
但是,您可以扩展ArrayList
类,设置其大小并在其构造函数中预先填充null
,并覆盖add(String)
方法以执行任何操作或类似的操作。 ..
答案 4 :(得分:0)
“我已经尝试过ArrayLists,但是如果我得到索引i的值小于容量,但不小于大小,则抛出IndexOutOfBoundsException ..”
尺寸和容量是两个完全不同的东西。 size是列表中元素的实际数量,而容量如果内存容量可用,直到它必须在引擎盖下调整大小
因此,如果您有容量10和大小4,那么您可以访问的最大索引是3。
首次初始化列表时,大小为0.每次添加时,大小都会增加1,而不是容量。
请记住,arraylist是一个阵列。容量是数组大小,即new int[10];
。但即使数组大小为10,实际列表也不是。 10是列表的容量。达到容量时,阵列的大小会增加,从而增加列表的容量。
答案 5 :(得分:0)
你应该创建一个自己的类class Array
并将所有功能初始化为你想要的。在您的情况下,这将是最好的解决方案。
答案 6 :(得分:0)
当您在边界之外添加索引时,您不使用列表。这是一个适合数组的要求。
最后我从阅读中得到了你想要一个List就像一个数组。为此,您必须触摸ArrayList实现。如果添加新元素超过列表的当前容量,则对其进行子类化并覆盖calles确保容量的每个方法,以便增加列表。
只需覆盖ensureCapacity并禁用它,抛出UnsupportedOperationException。然后,您还需要通过覆盖和抛出不支持的操作异常来禁用删除操作。
你甚至可能想要覆盖......所以你看到很多事情要做。
另一个简单的想法是使用HashMap。将整数存储到对象。如果integer超出范围,您只需在put操作中抛出IndexOutOfBoundsException。当得到的索引不在地图中时,无论如何都会返回null。
这很好,但我不会这样。
最后只是扭曲一个数组。使用Array.fill填充空值,因为在sepcs中它可能是随机的,但我看到它的每个实现总是被淘汰,否则JVM可能会破坏,因为随机内容可能被解释为引用。
所以让我们创建一个新的。您可以实现Collection接口甚至List接口,但最终可能只想在每个循环中使用它(对于element:list)。因此,您需要做的就是实现Iterable接口。
新类应该有set(int index,T object)和T get(int index)以及int size()。就这样。
没有列表不是你想要的。创建自己的实现包装数组。实现Iterable,如果你喜欢Collection,那么你很高兴。
答案 7 :(得分:0)
使用
List<MyObject> list = Arrays.asList(new MyObject[SIZE]);
这将创建一个由指定大小的数组支持的List,预先填充空值。此列表是可变的,但具有固定的大小。您可以使用set
更改特定位置的值,但add
和remove
会抛出异常。此外,List
和Collection
API的其余部分将用于阅读和迭代,这可能是您的意图。