Java中的可滚动列表

时间:2013-04-26 07:10:18

标签: java list

它可能不是一个合适的术语 - 可滚动但可滚动,我指的是具有不同视角的固定大小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应用程序中需要它,因此不能使用像JListJScrollPane之类的swing提供的组件。

6 个答案:

答案 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>接口linkLinkedList实现它:link。 您可以使用offer方法添加元素,并使用removepoll调用删除元素(从另一端,它是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]