当前位置: 首页 > 面试题库 >

大小限制的队列,其中包含Java中的最后N个元素

昝唯
2023-03-14
问题内容

关于Java库的一个非常简单Queue而又快速的问题:是否有一个现成的类,该类以固定的最大大小实现—即,它始终允许添加元素,但是它将静默删除head元素以容纳新添加元素的空间。

当然,手动实现它很简单:

import java.util.LinkedList;

public class LimitedQueue<E> extends LinkedList<E> {
    private int limit;

    public LimitedQueue(int limit) {
        this.limit = limit;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        while (size() > limit) { super.remove(); }
        return true;
    }
}

据我所知,Java stdlibs中没有标准实现,但是Apache Commons中可能有这种实现?


问题答案:

Apache Commons Collections 4具有你正在寻找的CircularFifoQueue <>。引用javadoc:

CircularFifoQueue是固定大小的先进先出队列,如果已满,将替换其最早的元素。

    import java.util.Queue;
    import org.apache.commons.collections4.queue.CircularFifoQueue;

    Queue<Integer> fifo = new CircularFifoQueue<Integer>(2);
    fifo.add(1);
    fifo.add(2);
    fifo.add(3);a
    System.out.println(fifo);

    // Observe the result: 
    // [2, 3]

如果你使用的是Apache Commons Collections(3.x)的较旧版本,则可以使用CircularFifoBuffer,这与没有泛型的情况基本相同。

更新:更新了支持通用的通用集合第4版之后的答案。



 类似资料:
  • 问题内容: 我想限制a的最大大小,以对正在实现的各种哈希算法进行度量。我在的一个重载构造函数中查看了loadfactor 。 我尝试在构造函数中将loadFactor设置为0.0f(这意味着我不希望HashMap的大小从EVER增大),但将此无效: 还有另一种方法来限制它的大小,使其永远不会增长吗? 问题答案: 有时越简单越好。

  • 问题 怎样从一个集合中获得最大或者最小的 N 个元素列表? 解决方案 heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] p

  • 几周后我有期末考试,我们的练习题是这样的: 给定一个N个整数的队列,在队列中找到最小值并将其从队列中删除。当您完成时,其余的值必须按照它们原来的顺序。您只能使用队列操作,也就是说,您无权访问数组或链表中的基础存储。描述实现此操作的最省时的方法,并给出以N表示的顺序(大O)。 编辑:队列操作是“enqueue”、“dequeue”、“isfull”、“isempty”,如果是循环队列,则是“fron

  • 问题内容: 我想返回该数字,只要它在限制范围内,否则返回限制的最大值或最小值。我可以结合使用和和。 我想知道,如果有一个现有的或我俯瞰功能。 如果第三方库很常见(例如Commons或Guava),则欢迎它们 问题答案: 从版本21开始,Guava包括(以及其他原语的等效方法)。从发行说明中: 添加了将给定值限制在和值定义的封闭范围内的方法。如果值在范围内,则返回值本身,如果值在范围内,则返回值,如

  • 给定一个向量和一个有序向量,我想要一个向量,其中 ] 等于 中最小元素的索引,以便

  • 我正在向一个ArrayList中添加三个不同的对象,但该列表包含我添加的最后一个对象的三个副本。 例如: 预期: 实际: 我犯了什么错误? 注意:这是针对本网站上出现的众多类似问题而设计的一个规范问答。