栈类型数据的运用

 

 

 如题:

代码:

package test;

import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Deque;
import java.util.HashMap;
import java.util.Scanner;
import java.util.UUID;
import java.util.function.BiFunction;
import java.util.function.IntBinaryOperator;

import com.sun.javafx.collections.MappingChange.Map;

import interfacetest.Animal;
import interfacetest.Cat;
import interfacetest.Dog;

public class Test {
	public static void main(String[] args) {	
		//记录重复次数,利用key是不许重复的特性,键Message是输入信息对象,包含时间,次数,内容。值Integer是记录重复次数
		HashMap<Message, Integer> mapRepeat = new HashMap<Message, Integer>();
		//BiFunction 操作数据value返回次数
	    BiFunction remappingFunction = new BiFunction<Integer, Integer, Integer>(){
	        @Override
	        public Integer apply(Integer oldValue, Integer addOne) {
	        	//oldValue原Map的value值,addOne自增值
	        	//计算返回的次数: 原值  + 自增值
	            return oldValue + addOne;
	        }
	    };
	  //栈类型,利用先进先出特定的方法操作,作数据存储仓库
	    Deque<Message> arrayDeque = new ArrayDeque<Message>(){	
	        public Integer num = 0; 		 //记录条数
	        @Override
	        public void addFirst(Message s) {//重写addFirst方法,
	            num++;
	            s.setNum(num);
	            super.addFirst(s);			//加入栈顶
	            //merge 原值不为null,函数根据key-value计算新值返回 ,自增数值1
	            mapRepeat.merge(s,1,remappingFunction);
	            if (this.size()>10) {		//存储后判断当前是否超过10条,超过则移除栈底的数据
	                Message s1 = this.removeLast();
	                s1.outer();
	            }
	        }
	    };
	    Scanner scanner = new Scanner(System.in);
        while(true){
            if (scanner.hasNext()){
                String next = scanner.next();
                if(next.equals("show")){
                    System.out.println("输入过:");
                    for (Message temp : mapRepeat.keySet()){
                        System.out.println(temp.getContent() +"\t"+ mapRepeat.get(temp)+"次");
                    }
                }else if (!next.equals("exit")){
                    arrayDeque.addFirst(new Message(next));
                }else{
                	break;
                }
            }
        }
	}   
} 
class Message{
    private Integer num;
    private String time;
    private String content;
    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");

    public Message(String content) {
        this.content = content;
        time = format.format(new Date());
    }

    public void outer(){
        System.out.println("第"+num+"条" + "\t" + time + "\t" + content);
    }

    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((content == null) ? 0 : content.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Message other = (Message) obj;
		if (content == null) {
			if (other.content != null)
				return false;
		} else if (!content.equals(other.content))
			return false;
		return true;
	}

	public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

运行结果:

aaa
aaa
show
输入过:
aaa 2次
bbb
ccc
ddd
ccc
show
输入过:
bbb 1次
aaa 2次
ddd 1次
ccc 2次

eee
show
输入过:
bbb 1次
aaa 2次
ddd 1次
ccc 2次
eee 1次

aaa
ccc
sss
ddd
第1条 2019年11月28日15时45分36秒 aaa

ggg
第2条 2019年11月28日15时45分37秒 aaa

zzzzz
第3条 2019年11月28日15时45分43秒 bbb

 

posted @ 2019-11-28 16:07  水中游鱼  阅读(302)  评论(0)    收藏  举报