从填充的hashmap检索的Arraylist不断返回空的arraylist

时间:2012-03-05 16:56:40

标签: java arraylist hashmap

我有一个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();
}   

我真的不确定为什么会这样。任何帮助,将不胜感激!

2 个答案:

答案 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);

每次添加时都无需创建新列表并进行复制。