我有一个hashmap,我在一个while循环中插入一个arraylist作为值。在迭代期间,如果hashmap已经包含一个键,我想要检索已存储的arraylist,将新数据附加到它并将其放回到hashmap中。
我现在遇到的问题是,当我检查一个hashmap是否包含一个值时,返回的arraylist的大小为0,好像我之前从未输入任何内容。
final HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
String status = "";
String channel = "";
while (daily.next()) {
while (avrg.next())
if (avrg.getString(1).equals(daily.getString(1)) && avrg.getString(2).equals(daily.getString(2))) {
final Object pstmnt = null;
final Object pstmnt2 = null;
final float thresholdValue = calcThreshold(pstmnt, pstmnt2, daily.getString(1));
channel = daily.getString("client_name");
if (daily.getFloat(3) > avrg.getFloat(3) + thresholdValue * avrg.getFloat(3)) {
status = "HIGHER";
}
else if (daily.getFloat(3) < avrg.getFloat(3) - thresholdValue * avrg.getFloat(3)) {
status = "LOWER";
}
else {
status = "Normal";
}
final PrintStream out;
out.println(channel);
out.println(thresholdValue);
out.println(status);
if (map.containsKey(channel)) {
out.println("map contained key");
final ArrayList<String> temp = new ArrayList<String>();
temp.addAll(map.get(channel));
out.println("previous size: " + temp.size());
temp.add(daily.getString("event"));
temp.add(Float.toString(daily.getFloat(3)));
temp.add(Float.toString(avrg.getFloat(3)));
temp.add(Float.toString(thresholdValue * 100));
temp.add(status);
out.println("current size: " + temp.size());
map.put(channel, temp);
out.println("array added to map");
temp.clear();
System.out.println("done");
}
else {
final ArrayList<String> temp = new ArrayList<String>();
out.println("new key created");
temp.add(daily.getString("event"));
temp.add(Float.toString(daily.getFloat(3)));
temp.add(Float.toString(avrg.getFloat(3)));
temp.add(Float.toString(thresholdValue * 100));
temp.add(status);
System.out.println(temp.size());
map.put(channel, temp);
System.out.println("array added to map");
}
}
avrg.beforeFirst();
}
我真的不确定为什么会这样。任何帮助,将不胜感激!
答案 0 :(得分:5)
问题就在这里:
map.put(channel, temp);
out.println("array added to map");
temp.clear();
temp.clear()
清除您刚刚添加到地图中的相同列表。由于temp
即将超出范围,因此该语句没有任何用处,可以删除。
答案 1 :(得分:1)
首先让我说@aix有正确的答案,但你应该重写你的代码以摆脱所有重复。 if块从
开始
if (map.containsKey(channel))
可简化为以下内容。
ArrayList<String> temp = map.get(channel);
if (temp == null) {
out.println("new key created");
ArrayList<String> temp = new ArrayList<String>();
map.put(channel, temp);
}
temp.add(daily.getString("event"));
temp.add(Float.toString(daily.getFloat(3)));
temp.add(Float.toString(avrg.getFloat(3)));
temp.add(Float.toString(thresholdValue * 100));
temp.add(status);
每次添加时都无需创建新列表并进行复制。