0

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

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

我该怎么做?

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

这是一个对话框。鲍勃:嘿,鲍比:哦,你来了!Bobby:我在找你 Joseph:是的,我知道我知道。詹姆斯:我不是在和你说话!约瑟夫:谁在乎?!?

这一切都将被放入一个队列中,我可以很容易地以某种方式获取他们的用户名和消息(我不知道)。从这 6 条消息中只能看到 5 条,因此 Bob 的消息将消失。

EDIT2:我希望它类似于:我的世界服务器

4

5 回答 5

3

您可以拥有一个MapApache CollectionsCircularFifoBuffer

//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 条消息,从缓冲区中删除最旧的消息。

编辑:

根据我对评论的理解:

让我告诉你我的意思 Bob:嗨 Bob:我很无聊 :l Joseph:哦,嘿嘿 Josephary:嘿 Joseph 和 Bob Joseph:哦,你们两个好吗?

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();

}
于 2013-08-01T11:56:22.820 回答
0

Unfortunately HashMap does NOT retain the order in witch the data was added.For you specific case you should use a LinkedHashMap because this kind of map is exactly like HashMap but keeps the order and you can iterate over it to get the last entries. But keep in mind that you cannot have multiple values for a single key so i dont think that you are looking for a map but for a Queue

于 2013-08-01T11:54:35.857 回答
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<>();
于 2013-08-01T12:03:37.903 回答
0

您有什么理由为此使用 HashMap 吗?当玩家再次说话时,HashMap 将删除播放的最后一个字符串。在我看来,您需要不同的数据结构来存储数据,例如 fifo 队列。

于 2013-08-01T11:56:11.503 回答
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}

于 2013-08-01T12:13:54.820 回答