实现一个固定长度的集合队列

在开发中,有时候我们会遇到这样的需求:

对一个集合操作,提前为集合指定最大大小,在我们不断向集合中添加数据的时候,当数据内容超过最大值的时候,自动将最先入队的元素移除队列。

实现方法很简单,代码如下

package com.test.limitqueue;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 实现一个固定长度的集合队列
 *
 * @author SHANHY(365384722@QQ.COM)
 * @date   2015年11月9日
 * @param <E>
 */
public class LimitQueue<E> implements Queue<E> {

	/**
	 * 队列长度,实例化类的时候指定
	 */
    private int limit;  

    Queue<E> queue = new LinkedList<E>();  

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

    /**
     * 入队
     */
    @Override
    public boolean offer(E e){
        if(queue.size() >= limit){
            //如果超出长度,入队时,先出队
            queue.poll();
        }
        return queue.offer(e);
    }  

    /**
     * 出队
     */
    @Override
    public E poll() {
        return queue.poll();
    }  

    /**
     * 获取队列
     *
     * @return
     * @author SHANHY
     * @date   2015年11月9日
     */
    public Queue<E> getQueue(){
        return queue;
    }  

    /**
     * 获取限制大小
     *
     * @return
     * @author SHANHY
     * @date   2015年11月9日
     */
    public int getLimit(){
        return limit;
    }  

    @Override
    public boolean add(E e) {
        return queue.add(e);
    }  

    @Override
    public E element() {
        return queue.element();
    }  

    @Override
    public E peek() {
        return queue.peek();
    }  

    @Override
    public boolean isEmpty() {
        return queue.size() == 0 ? true : false;
    }  

    @Override
    public int size() {
        return queue.size();
    }  

    @Override
    public E remove() {
        return queue.remove();
    }  

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return queue.addAll(c);
    }  

    @Override
    public void clear() {
        queue.clear();
    }  

    @Override
    public boolean contains(Object o) {
        return queue.contains(o);
    }  

    @Override
    public boolean containsAll(Collection<?> c) {
        return queue.containsAll(c);
    }  

    @Override
    public Iterator<E> iterator() {
        return queue.iterator();
    }  

    @Override
    public boolean remove(Object o) {
        return queue.remove(o);
    }  

    @Override
    public boolean removeAll(Collection<?> c) {
        return queue.removeAll(c);
    }  

    @Override
    public boolean retainAll(Collection<?> c) {
        return queue.retainAll(c);
    }  

    @Override
    public Object[] toArray() {
        return queue.toArray();
    }  

    @Override
    public <T> T[] toArray(T[] a) {
        return queue.toArray(a);
    }
}
package com.test.limitqueue;

/**
 * 测试
 *
 * @author SHANHY(365384722@QQ.COM)
 * @date   2015年11月9日
 */
public class TestQueue {

	public static void main(String[] args) {
		LimitQueue<String> list = new LimitQueue<String>(4);

		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
		list.offer("SHANHY");
		System.out.println(list.size());
	}

}
时间: 2024-08-03 13:28:42

实现一个固定长度的集合队列的相关文章

substring-给一个文件夹地址,此地址中xxx是不固定长度的任意字符串 要怎么截取到这个xxx

问题描述 给一个文件夹地址,此地址中xxx是不固定长度的任意字符串 要怎么截取到这个xxx 地址如下:E:workspacetrunkProject...ToolsV12DataBackup_xxx_yy-MM-dd_hh'mm 这是我自己的代码 为什么输出的还是原来的字符串? 表示我是菜鸟 求大神指教string str="E:workspacetrunkProject...ToolsV12DataBackup_xxx_yy-MM-dd_hh'mm"";str.Substr

如何在把超过固定长度的文字以……表示

有次,有个以前的同事(是个小MM)问我一个问题:她想在一个网页中显示一个文章标题的列表,但是考虑到有的标题太长,影响美观,就想参照别的网站上的样式,把超过固定长度的文字用省略号代替,但是自己又不知道如何实现,所以想到我(唉,需要我的时候才会想到我,呜--)拿到题目后,我决定从数据库来着手,写查询语句来实现,结果如下: 说明语句: SELECT (LEFT(原字段,位数)+'...') AS 新字段FROM 表名 WHERE DATALENGTH(原字段)>位数UNION ALLSELECT 原字

MySQL中静态(固定长度)表特征

静态格式是MyISAM表的默认存储格式.当表不包含变量长度列(VARCHAR, BLOB, 或TEXT)时,使用这个格式.每一行用固定字节数存储. MyISAM的三种存储格式中,静态格式就最简单也是最安全的(至少对于崩溃而言).静态格式也是最快的on-disk格式.快速来自于数据文件中的行在磁盘上被找到的容易方式:当按照索引中的行号查找一个行时,用行长度乘以行号.同样,当扫描一个表的时候,很容易用每个磁盘读操作读一定数量的记录. 当MySQL服务器正往一个固定格式MyISAM文件写的时候,如果计

mfc绘图-MFC中怎么才能画固定长度的直线?

问题描述 MFC中怎么才能画固定长度的直线? 只知道起点,不知道终点...而且不能重叠,所以我想用正多边形,正多边形中心点到各点距离相等,且不重叠,,但是正多边形又不能得到中心点.....怎样才能得到中心点??或者有更好的办法可以画,而且可以得到直线的终点? 解决方案 正多边形求中心点这是数学问题吧 解决方案二: 你只说画固定长度的直线,但还是没把意思说清楚. 你一这个点为圆心,用Ellipse()方法绘制一个圆,外部图形和这个圆的交点就是你要的点,不过交点左边不好求. 再就是风雨你要画直线的长

php生成固定长度纯数字编码的方法_php技巧

本文实例讲述了php生成固定长度纯数字编码的方法.分享给大家供大家参考.具体如下: 很多时候我们需要一些固定长度的数字编码,如订单编号.卡号.用户编号等等!但是经常我们有的是存储在数据库中的有序编号,我们可以通过它直接转成一个固定长度的数字编码,然后更新到数据库中形成此记录的唯一编号. <?php /** * 根据日期或者是给定前缀生成唯一编号 * User: minyifei.cn * Date: 15/7/7 */ namespace Minyifei\Libs; class Sequenc

字符串处理:中英文混排固定长度截取问题

/// <summary>    /// 从包含中英文的字符串中截取固定长度的一段,strInput为传入字符串,intLen为截取长度(一个汉字占两个位).    /// </summary>    public string cutString(string strInput,int intLen)    {     strInput=strInput.Trim();     byte[] myByte = System.Text.Encoding.Default.GetByt

js截取固定长度的中英文字符的简单实例_javascript技巧

js虽然提供了计算字符串所占字节数的函数,但是却不能正确计算汉字所占的字节数,如document.form1.username.value="我是中国人",document.form1.username.value.length返回的是5而不是10,于是给编程时带来一些麻烦,如限制固定长度字符的输入,截取固定长度的字符串都因为这个问题达不到预想的效果,下面是自己写的一个简单的函数,用于截取固定长度的字符串,中英文都适用.若有不妥之处还请高手指正! 复制代码 代码如下: //js截取字符

求算法,一个n长度的数组,要将数组分成n个组

问题描述 求算法,一个n长度的数组,要将数组分成n个组每个组将数组中的所有元素分成m份,且不能重复出现(m的值等于组号即第几组就是分几份,不考虑排序)如数组,List<int>arr=newList<int>{1,2,3};要分成3个组,第一个组和n个组是固定的第1个组将数组分成1份,即vargroup=newList<List<int>>{newList<int>{1,2,3}};第2个组把数组中所有元素分成2份,可能出现以下的分法:1.var

已知线段两端点和一固定长度,求第三点

问题描述 空间线段的两端(a点和b点)坐标已知为a=(x1,y1,z1),b=(x2,y2,z2)已知一固定长度为7.5求以a(x1,y1,z1)为端点,在ab方向上长度为7.5的点的坐标a__________________b________cc点可能在ab上,也可能在ab的延长线上.请各位大侠指点迷津,不胜感激! 解决方案 解决方案二:纯数学问题......解决方案三:汗,几何都忘光了.解决方案四:由a,b坐标求出一个ab方向的向量,再除以ab的长度,得出这个方向的单位向量(x,y,z),则