2013-08-01 74 views
0

我有一個HashMap<String, String>,每次玩家說話時我都會輸入一個條目到HashMap中。 Bob492說'嗨'。我將輸入'Bob492'和'Hi'作爲它的值。獲取最新/最新的HashMap條目

現在我需要一種方法將最後5條消息捕獲到他們自己的字符串中,每個字符串都有一個字符串。

我該怎麼做?

編輯:感謝回覆,似乎HashMap不是最好的方法來做到這一點,但隊列可能會更好。例如,我將如何實現這一點。

這是一個對話框。 鮑勃:嘿 鮑比:哦,你是!鮑比:我在找你 約瑟夫:是的,我知道我知道。詹姆斯:我不是在跟你說話!約瑟夫:誰在乎?!?

這將全部放在隊列中,我可以很容易地獲取他們的用戶名和消息(我不知道)。從這6條消息中只能看到5條,所以Bob的消息就會消失。

EDIT2:我希望它與此類似:A minecraft server

+1

您是否考慮過使用severa l數據結構(例如一個哈希映射和一個fifo隊列)? –

+0

我很困惑,你是什麼意思,因爲我從來沒有聽說過fifo隊列。 – Lewes

+0

該鍵可以始終保持一個值,即最新更新的值。還是你想在這裏實現隊列功能? –

回答

0

不幸的是HashMap確實保留女巫的數據是added.For您特定的情況下,你應該使用LinkedHashMap因爲這種地圖的順序與HashMap完全一樣,但保持順序,您可以遍歷它以獲取最後的條目。 但請記住,你不能有多個值的一個鍵,所以我不認爲你正在尋找一個地圖,爲Queue

0

是否有您使用的是此一個HashMap的原因嗎?由於HashMap將刪除播放器在播放時再次播放的最後一個字符串。在我看來,你需要一個不同的數據結構來存儲你的數據,比如fifo隊列。

3

您可以有MapCircularFifoBufferApache 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條消息,從緩衝區中刪除最舊的消息。

編輯:

按照從評論我的理解:

讓我告訴你我是什麼意思鮑勃:嗨,鮑勃:我很無聊:L約瑟夫:哦heyyy Josephary :嘿約瑟夫和鮑勃約瑟夫:哦,你好嗎?

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

} 
+0

那麼我將如何檢索消息,如第二條消息? – Lewes

+0

哪位用戶的第二封留言? –

+0

讓我告訴你我是什麼意思 鮑勃:嗨 鮑勃:我很無聊:L 約瑟夫:哦heyyy Josephary:嘿約瑟夫和Bob 約瑟夫:啊,怎麼是你們兩個? – Lewes

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

但是之後我會要求玩家名稱來檢索我不知道的數據。我只需要一種方法來存儲玩家名和他們的消息。我向玩家發回最多5條最新消息。 – Lewes

+0

然後不要使用地圖,並組成消息形成'用戶+「:」消息「並將其放入緩衝區。 –

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}