包含max元素的java列表
我想用java创建一个列表,在添加新元素时,它将检查是否达到了限制。如果是,请删除最旧的元素
我正在考虑将ArrayList的子对象化并覆盖add(Object)。在这里,我要说:
if(size() + 1 > MAX)
remove(get(0));
super.add(newObject);
还有更好的办法吗
你可以在下面搜索框中键入要查询的问题!
我想用java创建一个列表,在添加新元素时,它将检查是否达到了限制。如果是,请删除最旧的元素
我正在考虑将ArrayList的子对象化并覆盖add(Object)。在这里,我要说:
if(size() + 1 > MAX)
remove(get(0));
super.add(newObject);
还有更好的办法吗
# 1 楼答案
你可以按照你描述的方式来做,但是这样一个列表的性能很低。假设已经达到极限,您移除了第一个元素。在幕后,这将涉及将基础数组的所有元素向上复制一个索引。然后新元素被添加到最后一个索引中。尤其是复制所有元素的成本很高
或者,您可以使用
LinkedList
,这对此类操作更有效另一种方法是编写自己的类来实现Circular Buffer。 这基本上是一个最大大小的数组。你必须保留第一个元素的索引和数组中元素的数量。添加元素时,检查元素数是否等于MAX,如果是,则覆盖第一个元素并将第一个元素的索引增加一。 索引的getter和setter也需要考虑第一个元素的偏移量,但这并不太复杂
最佳选择取决于您的用例。如果必须在列表中的任意位置执行大量插入和删除操作,
LinkedList
绝对是一种方法。如果您只想在末尾添加项目并移除头部,那么循环缓冲区非常有效# 2 楼答案
您可以使用Deque:
# 3 楼答案
在我看来,您应该使用带有列表包装器的数组。然后你可以做任何你想做的事。还可以添加返回列表的方法,例如get
# 4 楼答案
制作自己的课程来完成这项工作。跟踪两个变量。一个表示零元素,另一个表示下一个元素的位置
# 5 楼答案
对此可能有很多解决方案,但我认为如果您做一个更改,您的方法是合适的:您的底层实现类应该是^{} ,而不是^{} 。原因是,当你在一个
ArrayList
上调用remove
时,移除值之后的每个元素都必须上移(使remove(0)
成为最坏的情况!)。然而,这对LinkedList
来说不是问题# 6 楼答案
您描述的是一个循环fifo缓冲区。您可以使用Apache Commons collections实现
参见Commons Collections和CircularFifoBuffer获取文档