它可能不是一个合适的术语 - 可滚动但可滚动,我指的是具有不同视角的固定大小java.util.List
。
列表应该有已定义的数字元素(预定义大小)。如果尝试添加的元素多于定义的大小,则应添加这些元素,同时删除列表中最顶层的元素。
例如,假设List具有5个元素的预定义大小,并且它已经包含如下所示的许多元素(假设List是泛型类型的String),
A
B
C
D
E
现在,如果添加了一个额外的元素F
,那么顶部的元素(A
)应该向上滚动并消失。列表现在应该具有以下元素。
B
C
D
E
F
同样,如果添加G
,则它应包含以下元素。
C
D
E
F
G
删除最顶层的元素B
,依此类推。
有没有合适的方法呢?有没有可以支持这种功能的库?
BTW,结构不一定只是java.util.List
。它可以是任何东西,从数组开始,但由于我在Web应用程序中需要它,因此不能使用像JList
,JScrollPane
之类的swing提供的组件。
答案 0 :(得分:4)
您可以使用ArrayList
:
ArrayList<Object> s = new ArrayList<>();
//Assuming the list has been populated
s.remove(0);
s.add(newObject);
这将删除索引0处的元素,然后在ArrayList
的末尾添加一个元素,为您提供所需的结果。
答案 1 :(得分:4)
您需要的是像Queue.
这样的FIFO数据结构您可以编写自己的实现,使其保持固定大小,如this,或为LinkedList等现有实现编写包装。
答案 2 :(得分:1)
你想要的是一个FIFO队列。
Java有Queue<E>
接口link,LinkedList
实现它:link。
您可以使用offer
方法添加元素,并使用remove
或poll
调用删除元素(从另一端,它是FIFO)。
您可以看到其他实现,也可以指定容量。
如果有适合您需要的产品,我不建议您自己编写。
答案 3 :(得分:1)
LinkedList将解决您的问题,这是FIFO Queue
的实施。
超过更快而不是List
(操作)。
该类实现Queue接口,为add,poll等提供先进先出队列操作。其他堆栈和双端队列操作可以根据标准列表操作轻松重新编写。它们包含在这里主要是为了方便起见,尽管它们的运行速度可能比等效的List操作
稍快
答案 4 :(得分:1)
要添加其他答案,您要描述的是circular buffer。 Java的集合类都没有直接实现循环缓冲区,正如其他答案所示,您可以非常轻松地模仿这些功能。
答案 5 :(得分:1)
我不知道是否有任何支持该功能的库。 但你可以制作一个简单的方法,只是为了做你想要的。 我自己完成了,虽然这很直接。
List<String> myList = new ArrayList();
int maxSize = 5;
myList.add("A");
myList.add("B");
myList.add("C");
myList.add("D");
myList.add("E");
int listSize = myList.size();
System.out.println("List Value BEFORE Maximum Size Reached : ");
System.out.println(myList.toString());
if (myList.size() >= maxSize) {
myList.remove(0);
myList.add("F");
}
System.out.println("List Size AFTER Maximum Size Reached : " + listSize);
System.out.println("List Value AFTER Maximum Size Reached : ");
System.out.println(myList.toString());
这就是结果:
List Value BEFORE Maximum Size Reached :
[A, B, C, D, E]
List Size AFTER Maximum Size Reached : 5
List Value AFTER Maximum Size Reached :
[B, C, D, E, F]