java大小固定的队列——保存最后N个元素

我们在应用中有时会用到这样一个数据结构——一个大小固定的队列,每次插入数据后最新的数据被删除,就类似一个圈,每次加入新元素后旧元素被覆盖。

1、EvictingQueue:

Guava现在有一个EvictingQueue , 一个非阻塞队列,当尝试向队列中添加新元素并且它已满时,会自动从其头部驱逐一个元素。我们可以把EvictingQueue想象成一个我们以仅追加方式插入元素的环。如果我们想要添加新元素的位置上有一个元素,我们只是覆盖给定位置的现有元素。

import java.util.Queue;
import com.google.common.collect.EvictingQueue;

Queue<Integer> fifo = EvictingQueue.create(2); 
fifo.add(1); 
fifo.add(2); 
fifo.add(3); 
System.out.println(fifo); 

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

2、手动实现:

我们也可以借助先有的数据结构,自己实现这个逻辑:

import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.stream.IntStream;
import com.google.common.collect.EvictingQueue;
import com.google.common.collect.MinMaxPriorityQueue;

public class Test1 {

	public static void main(String[] args) {

		LimitedQueue<String> qu = new LimitedQueue<>(2);
		qu.add("1");
		qu.add("2");
		qu.add("3");
		
		System.out.println(qu);
	}
}

class LimitedQueue<E> extends LinkedList<E> {
	private static final long serialVersionUID = 1L;
	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;
    }
}


输出:[2, 3]

https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue

猜你喜欢

转载自blog.csdn.net/liuxiao723846/article/details/81782507