获取最新/最新的HashMap条目

时间:2013-08-01 11:46:04

标签: java bukkit

我有一个HashMap<String, String>,每次玩家说话时我都会在HashMap中输入一个条目。 Bob492说'嗨'。我将输入'Bob492'和'Hi'作为其值。

现在我需要一种方法将最后5条消息捕获到自己的字符串中,每个字符串一个字符串。

我该怎么做?

编辑:由于回复,似乎HashMap不是最好的方法,但队列可能会更好。例如,我将如何实现这一目标。

这是一个对话框。 鲍勃:嘿 鲍比:哦,你在那儿! 鲍比:我在找你 约瑟夫:是的,我知道我知道。 詹姆斯:我没跟你说话! 约瑟夫:谁在乎?!?

这将全部放入队列中,我可以轻易地以某种方式获取用户名和消息(我不知道)。只能看到6条消息中的5条,所以Bob的消息就会消失。

EDIT2:我希望它与此类似:A minecraft server

5 个答案:

答案 0 :(得分:3)

您可以Map CircularFifoBuffer Apache Collections

//maps username to last 5 messages
Map<String,CircularFifoBuffer> map = new HashMap<String,CircularFifoBuffer>();

//putting the values

if(map.get(username) == null){
    CircularFifoBuffer last5messages = new CircularFifoBuffer(5);
    last5messages.add(message);
    map.put(last5messages);
}else{
    //similar code
}

什么是CircularFifoBuffer?

  

CircularFifoBuffer是具有固定大小的先进先出缓冲区   如果已满,则替换最旧的元素。

这样就可以自动存储最后5条消息,从缓冲区中删除最旧的消息。

修改

根据我对评论的理解:

  

让我告诉你我的意思鲍勃:嗨鲍勃:我很无聊:约瑟夫:哦,嘿嘿   约瑟法里:嘿约瑟夫和鲍勃约瑟夫:你们两个怎么样?

class MessageEntry{
    String userName;
    String message;

    public MessageEntry(String userName, String message){
       //store
    }

    public String getUsername(){
        return userName;
    }

    public String getMessage(){
        return message;
    }

}

//just a buffer to store last 5 messages received
CircularFifoBuffer last5messages = new CircularFifoBuffer(5);


//for storing last 5 messages
last5messages.add(new MessageEntry(userName,message));


//for retrieving elements:
Object[] messages = last5Messages.toArray();
//gives you messages that you can use any way you want


for(Object message : messages){
   MessageEntry entry = (MessageEntry)message;

   String userName = entry.getUsername();
   String message = entry.getMessage();

}

答案 1 :(得分:0)

不幸的是HashMap确实保留添加数据的顺序。对于特定情况,您应该使用LinkedHashMap,因为这种地图与HashMap完全相同但保留订单,你可以迭代它以获得最后的条目。 但请记住,您不能为单个密钥设置多个值,因此我不认为您正在寻找地图,而是Queue

答案 2 :(得分:0)

你有没有理由为此使用HashMap?因为当玩家再次说话时,HashMap将删除播放时所说的最后一个字符串。听起来像你需要一个不同的数据结构来存储你的数据,比如一个fifo队列。

答案 3 :(得分:0)

HashMap不支持此类行为。您需要做的是创建或查找将执行代码逻辑部分的类。逻辑说你需要在某个地方存储五条消息。简单MessageBuffer,应该为你做的工作。

class MessagesBuffer {

 private String[] recent;

 public MessagesBuffer(int size) { 
   this.recent = new String[size];
 }

 public void addMessage(String messsage) {

   for(int i = 1; i < recent.lenght; i++) {
     recent[i] = recent[i-1];
   }

   this.recent[0] = message;

 }

/*Other implementation details*/

} 

当你有一个执行逻辑的结构时,你可以使用Map将它与一个人绑定。

Map<User,MessageBuffer> recent = new HashMap<>();

答案 4 :(得分:0)

你可以使用LinkedHashMap,这个

    LinkedHashMap m = new LinkedHashMap(16, 0.75f, true) {
        protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
            return size() > 5;
        };
    };

确保地图包含5个最近的条目

    m.put("1", "1");
    m.put("2", "2");
    m.put("3", "3");
    m.put("4", "4");
    m.put("5", "5");
    m.put("6", "6");
    System.out.println(m);

输出

{2 = 2,3 = 3,4 = 4,5 = 5,6 = 6}