当前位置: 首页 > 面试题库 >

圆形ArrayList(扩展ArrayList)

夹谷鸿福
2023-03-14
问题内容

因此,我的程序需要一种圆形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索引之外的任何内容访问第一个元素和最后一个元素,我希望它引发异常。


问题答案:

您不能从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)方法,这是原始的: 我不能让它工作,因为我的班级看不到它,因为它是私人的。 另外,我不想为此使用任何外部库,因为我认为没有适合我需要的库,因为我不想要一个真正的circularArray,而只想要它的一部分功能,其余部分是常规的ArrayList。 所以我有两个问题:

  • 问题内容: 我想扩展ArrayList,为特定类添加一些方法,这些类的实例将由扩展的ArrayList保存。下面是一个简化的说明性代码示例。 这对我来说似乎是明智的,但是我对Java还是很陌生,我看到了其他阻碍扩展ArrayList的问题,例如,扩展ArrayList和创建新方法。我对Java的理解不够了解。 在我先前的尝试中,我最终在ThingContainer中创建了许多实际上是传递给Arra

  • 高级模块可以使用扩展名或变异符,使其更具动态性和可配置性。 扩展允许将块的程序化配置,额外的初始化或自定义行为添加到块中。例如,几个块parent_tooltip_when_inline 在连接到另一个块时使用 扩展名显示其父级的工具提示。 增变器非常类似于扩展。除了更改块之外,它还定义了如何将那些更改保存到XML以及如何从XML加载。变量器还可以具有其他UI,供用户配置其状态。在Blockly中

  • 问题内容: 我在掌握某些内容时遇到了一些问题-我可能正在处理完全错误的问题。 我正在尝试创建一个扩展ArrayList的类,但是具有一些增加功能的方法(至少对于我正在开发的程序而言)。 方法之一是findById(intid),它在每个ArrayList对象中搜索特定的id匹配项。到目前为止,它仍然有效,但它不会让我做for (Item i : this) { i.getId(); } 我不明白为

  • SVG 圆形 - <circle> <circle> 标签可用来创建一个圆: 下面是SVG代码: <svg xmlns="http://www.w3.org/2000/svg" version="1.1">   <circle cx="100" cy="50" r="40" stroke="black"   stroke-width="2" fill="red"/> </svg> 对于Opera用

  • 问题内容: 工具的实现以及扩展。但是在Java文档中,您可以看到AbstractList已经实现了List。那么实现List以及扩展AbstractList是否不是多余的? 我的第二个问题, 请看下面的代码: Arrays类的方法包含其自己的ArrayList实现。但这仅扩展AbstractList而未实现List。但是上面的代码可以编译。 但是将代码修改为以下内容时 我收到一个错误: 这是什么原