问题描述
您不能从ArrayList派生并沿这些行覆盖get(int index)方法:
@Override
public E get(int index)
{
if(index < 0)
index = index + size();
return super.get(index);
}
我想念什么?
请注意,此实现不会将任意索引折叠到有效索引范围内,而仅允许您从左侧和右侧正确寻址列表(分别为正索引和负索引,有点像Python)。
解决方法
因此,我的程序需要一种圆形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);
}
如果index为-1,则应获取索引为ArrayList.size()-1的元素;如果index为ArrayList.size(),则应获取索引为0的元素。
我想到的最简单的方法是从java.util包扩展ArrayList并覆盖get(int
index),这样它就不会为上述两个索引抛出IndexOutOfBoundsException,而是将它们更改为我想要的。它将为超出范围的任何其他索引抛出IndexOutOfBoundsException。
但是,由于elementData(index)访问一个
private transient Object[] elementData;
我无法使其正常运行,因为我的班级因为私有而无法看到它。
另外,我不想为此使用任何外部库,仅仅是因为我认为没有一个适合我的需要,因为我不想要一个真正的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索引之外的任何内容访问第一个元素和最后一个元素,我希望它引发异常。