我有一个HashMap<String, String>
,每次玩家说话时我都会在HashMap中输入一个条目。 Bob492说'嗨'。我将输入'Bob492'和'Hi'作为其值。
现在我需要一种方法将最后5条消息捕获到自己的字符串中,每个字符串一个字符串。
我该怎么做?
编辑:由于回复,似乎HashMap不是最好的方法,但队列可能会更好。例如,我将如何实现这一目标。
这是一个对话框。 鲍勃:嘿 鲍比:哦,你在那儿! 鲍比:我在找你 约瑟夫:是的,我知道我知道。 詹姆斯:我没跟你说话! 约瑟夫:谁在乎?!?
这将全部放入队列中,我可以轻易地以某种方式获取用户名和消息(我不知道)。只能看到6条消息中的5条,所以Bob的消息就会消失。
EDIT2:我希望它与此类似:
答案 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}