Java 包含最大元素的列表
我想用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
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