2

这可能不是一个合适的术语 - 可滚动但可滚动,我的意思是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等等。

有没有公​​平的方法来做到这一点?是否有任何库可以支持这种功能?

顺便说一句,结构不一定只有一个java.util.List. 它可以是任何东西,从数组开始,但由于我在 Web 应用程序中需要它JListJScrollPane因此无法使用 swing 提供的组件。

4

6 回答 6

4

您可以使用以下命令执行此操作ArrayList

ArrayList<Object> s = new ArrayList<>();
//Assuming the list has been populated
s.remove(0);
s.add(newObject);

这将删除索引 0 处的元素,然后将一个元素添加到 . 的末尾ArrayList,从而为您提供所需的结果。

于 2013-04-26T07:13:37.907 回答
4

您需要的是像队列这样的 FIFO 数据结构。

您可以编写自己的实现以将其保持在这样的固定大小,或者为现有的实现(如LinkedList )编写包装器。

于 2013-04-26T07:16:59.797 回答
1

你想要的是一个先进先出队列。Java 有一个Queue<E>接口linkLinkedList实现它:link。您可以使用方法添加元素并使用or调用offer删除元素(从另一端,它是一个 FIFO) 。您可以查看其他实现,也可以指定容量。如果有适合您需求的可用版本,我不建议您自己编写。removepoll

于 2013-04-26T07:17:10.180 回答
1

LinkedList将解决您的问题,这是FIFO Queue.

比(操作)更快List

该类实现了 Queue 接口,为 add、poll 等提供先进先出队列操作。其他堆栈和 deque 操作可以根据标准列表操作轻松重铸。将它们包含在这里主要是为了方便,尽管它们的运行速度可能比等效的 List 操作稍快

于 2013-04-26T07:21:09.690 回答
1

要添加到其他答案,您正在描述一个循环缓冲区。正如其他答案所暗示的那样,Java 的集合类都没有直接实现循环缓冲区,您可以相当容易地模仿该功能。

于 2013-04-26T07:24:51.063 回答
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]
于 2013-04-26T07:40:45.710 回答