如题:
代码:
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() +" "+ 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+"条" + " " + time + " " + 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