Java 包含最大元素的列表

Java 包含最大元素的列表,java,list,arraylist,Java,List,Arraylist,我想用java创建一个列表,在添加新元素时,它将检查是否达到了限制。如果是,请删除最旧的元素 public class MyList<T> { private T array[]; private int first; private int next; private int count; public MyList(int count) { array = new T[count]; } publ

我想用java创建一个列表,在添加新元素时,它将检查是否达到了限制。如果是,请删除最旧的元素

public class MyList<T>
{
    private T array[];
    private int first;
    private int next;
    private int count;

    public MyList(int count)
    {
        array = new T[count];
    }

    public void add(T obj)
    {
        array[next++] = obj;
        next %= array.length;
        if (count == array.length)
        {
            zero = (zero + 1) % array.length;
        } else count++;
    }

    public T get(int index)
    {
        return array[(zero + index) % array.length];
    }
}
我正在考虑将ArrayList的子对象化并覆盖add(Object)。在这里,我要说:

if(size() + 1 > MAX)
    remove(get(0));
super.add(newObject);

有更好的方法吗?

对此可能有很多解决方案,但如果您做了一个更改,我认为您的方法是合适的:您的底层实现类应该是a,而不是。原因是,当您在
ArrayList
上调用
remove
时,删除值之后的每个元素都必须上移(使
remove(0)
成为最坏的情况!)。但是,对于
链接列表来说,这不是问题。您可以按照前面描述的方式进行操作,但是这样的列表的性能很低。假设已达到限制,并删除第一个元素。在后台,这将涉及将基础数组的所有元素向上复制一个索引。然后将新元素添加到最后一个索引中。尤其是复制所有元素的成本很高

或者,您可以使用
链接列表
,这对于此类操作更有效

另一种方法是编写自己的类来实现。 这基本上是一个最大大小的数组。您必须保留第一个元素的索引和数组中元素的数量。添加元素时,检查元素数是否等于MAX,如果是,则覆盖第一个元素并将第一个元素的索引增加1。 索引的getter和setter也需要考虑第一个元素的偏移量,但这并不太复杂


最佳选择取决于您的用例。如果您必须在列表中的任意位置执行大量插入和删除操作,
LinkedList
无疑是一种方法。如果您只想将项目添加到末尾并删除头部,则循环缓冲区非常有效

IMO,您应该使用带有列表包装器的数组。然后你可以做任何你想做的事。您还可以添加方法,例如返回列表的get。

您可以使用:

private final int LIMIT=10;
private Deque queue=new ArrayDeque(限制);
公共void addToList(最后一个字符串元素){
Deque队列=新阵列队列(限制);
如果(!queue.offer(元素)){
queue.removeFirst();
报价(要素);
}
}

您描述的是循环fifo缓冲区。您可以使用apachecommons集合实现


有关文档,请参见和

制作自己的类来完成此工作。跟踪两个变量。一个表示零元素,另一个表示下一个元素的位置

public class MyList<T>
{
    private T array[];
    private int first;
    private int next;
    private int count;

    public MyList(int count)
    {
        array = new T[count];
    }

    public void add(T obj)
    {
        array[next++] = obj;
        next %= array.length;
        if (count == array.length)
        {
            zero = (zero + 1) % array.length;
        } else count++;
    }

    public T get(int index)
    {
        return array[(zero + index) % array.length];
    }
}
公共类MyList
{
专用T数组[];
私人int优先;
私有int next;
私人整数计数;
公共MyList(整数计数)
{
数组=新的T[计数];
}
公共无效添加(T obj)
{
数组[next++]=obj;
next%=array.length;
if(count==array.length)
{
零=(零+1)%array.length;
}else-count++;
}
公共T获取(整数索引)
{
返回数组[(零+索引)%array.length];
}
}

这不是个好主意。删除
ArrayList的第一个元素
会导致所有其他元素移位(这需要
O(n)
时间)。你应该用一个圆形数组来代替。除了jazzbassrob的答案之外,这可能是有趣的。另请参见其他建议,使用圆形数组。但一般来说,我更喜欢组合而不是继承,这允许使用装饰器模式。因此,如果我想使用一个列表,我宁愿为该列表创建一个decorator类,该类强制执行最大大小(从而允许decorator用户在ArrayList和LinkedList甚至其他列表之间进行选择)而不是创建ArrayList或LinkedList的子类。但在大多数已知的库(如Javolution或Trove)中还没有这样做,对吗?这是很多的提示:)@user2618929:see