0

HashMap<String, String>たとえば、プレイヤーが話すたびに HashMap にエントリを入力しています。Bob492 は「こんにちは」と言います。'Bob492' と 'Hi' を値として入力します。

ここで、最後の 5 つのメッセージを独自の文字列 (それぞれに 1 つの文字列) にキャプチャする方法が必要です。

どうすればいいですか?

編集:返信のおかげで、HashMap はこれを行うための最良の方法ではないようですが、キューの方が良いかもしれません。たとえば、これをどのように達成しますか。

これはダイアログです。ボブ: やあ、ボビー: ああ、そこにいるよ! ボビー:私はあなたを探していました ジョセフ:ええ、知っています。ジェームス: 私はあなたと話していませんでした! ジョセフ: 誰が気にする?!?

そして、それはすべてキューに入れられ、どうにかしてユーザー名とメッセージを簡単に取得できます (わかりません)。その 6 つのメッセージのうち 5 つしか見えないので、ボブのメッセージは消えてしまいます。

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 つのメッセージが自動的に保存され、最も古いメッセージがバッファから削除されます。

編集:

コメントからの私の理解によると:

私が何を意味するかをお見せしましょう。

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

これに 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 に答える
0

HashMap はそのような動作をサポートしていません。コードのロジック部分を実行するクラスを作成または検索する必要があります。ロジックは、どこかに 5 つのメッセージを保存する必要があることを示しています。シンプルな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 に答える