所以我的程序需要一种循环ArrayList。
唯一循环的就是get(int index)方法,这是原文:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
如果索引为 -1,它应该获取索引为 ArrayList.size()-1 的元素,如果索引为 ArrayList.size(),它应该获取索引为 0 的元素。
我想到的实现此目的的最简单方法是简单地从 java.util 包中扩展 ArrayList 并覆盖 get(int index) 所以它不会为上面的两个索引抛出 IndexOutOfBoundsException,而是将它们更改为我想要的想。对于超出范围的任何其他索引,它会抛出 IndexOutOfBoundsException。
但是,由于 elementData(index) 访问了一个
private transient Object[] elementData;
我无法让它工作,因为它是私有(private)的,所以我的类(class)看不到它。
此外,我不想为此使用任何外部库,只是因为我认为没有一个适合我的需要,因为我不想要一个真正的 circularArray,但只需要它的一部分功能,其余的它属于常规的 ArrayList。
所以我有两个问题:
我怎样才能使这项工作?有没有一种方法可以不将整个 ArrayList 类连同 AbstractCollection、Collection 和 Iterable 复制到我的程序中?即使对我来说,这似乎也是糟糕的设计。
如果我能以某种方式让它发挥作用,还有什么我应该注意的吗?如果我进行上述更改,是否会仅按我希望的方式更改类的行为,还是会出现任何其他不需要的行为更改?
编辑: 感谢您的回答,这是我所做的:
import java.util.ArrayList;
public class CircularArrayList<E> extends ArrayList<E>
{
private static final long serialVersionUID = 1L;
public E get(int index)
{
if (index == -1)
{
index = size()-1;
}
else if (index == size())
{
index = 0;
}
return super.get(index);
}
}
它将环绕 ArrayList,但仅环绕一个。如果我尝试使用除常规 ArrayList 索引之外的任何其他元素访问除第一个和最后一个元素之外的任何其他元素,我希望它抛出异常。
最佳答案
您可以扩展 ArrayList 类来更改 get
方法的功能,而无需访问 elementData
字段:
public class CircularList<E> extends ArrayList<E> {
@Override
public E get(int index) {
return super.get(index % size());
}
}
super.get
方法仍会执行范围检查(但永远不会失败)。
您应该知道这样做会给 ArrayList 带来不稳定的索引。如果列表的大小发生变化,那么正常范围之外的所有索引都会发生变化。例如,如果您有一个列表 ['a','b','c','d','e']
,那么 get(7)
将返回 c
。如果您随后执行 add('f')
,那么 get(7)
将突然返回 b
,因为 get
现在将以模 6 而不是模 5 工作。
关于java - 循环 ArrayList(扩展 ArrayList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18659792/