我有一个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();
}
//}
}
上面的代码不保留以前消息的数据。有人可以暗示一下吗?
谢谢
答案 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) );