如何将数据保存到哈希表中 - java

时间:2013-03-05 20:06:56

标签: java hashtable

我有一个Socket服务器,等待客户端以json格式发送消息。 我不需要将数据存储到数据库中,但是现在,我想将它们保存在哈希表中。因此,当客户端发送消息时,服务器会将其添加到散列表而不会丢失先前的消息。

以下是我的哈希表的声明:

private static Hashtable<Integer,String> table = new Hashtable<Integer,String>();

以下是称为消息的方法到达服务器:

    private void HashTable(String string){
    //JsonArray questions =  new JsonArray();
    //questions = string;
    //for(int i = 0; i < questions.length(); i++) {
        //JsonObject question = questions.getJsonObject(i);
        JSONObject jsonObj;
        try {
            jsonObj = new JSONObject(string);
            int id = jsonObj.optInt("DeviceID", -1);
            String name = jsonObj.toString();
            table.put(id, name);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    //}
}

上面的代码不保留以前消息的数据。有人可以暗示一下吗?

谢谢

2 个答案:

答案 0 :(得分:2)

int id = 1; - 你永远不会改变它,所以你所做的就是每次都替换ID 1的条目。您需要一个唯一的ID生成器,或者只是在每次添加条目时递增id

修改:正如评论者正确指出的那样,您应该使用HashMap而不是HashTable,并且真的不应该调用您的方法Hashtable ...

编辑2:您更改了代码示例,因此不再准确,但现在发生的情况是DeviceID不存在,因此您获得-1或者您持续获得相同的设备ID 。当然,您说您想要存储来自同一设备的多条消息,因此使用它自己的设备ID并不是您想要做的。您可能应该拥有某种消息ID,很可能是在设备上生成的,并以某种方式合并设备ID以帮助确保它是唯一的。

答案 1 :(得分:1)

这是因为,当“DeviceId”从Json为空时,您将始终以相同的键“1”存储。 因此它取代了原来的价值。

<强>解决方案

private static AtomicInteger count = new AtomicInteger ;

在您插入哈希表的位置 适应

int id = jsonObj.optInt("DeviceID", count.addAndGet(1) );