HashMap打印只是最后一个条目

时间:2012-04-15 12:14:48

标签: java hashmap

我正在编写一个显示时间与大小的代码。 我正在使用hashmap进行输入。问题是它正确地进行了计算,但最后当我尝试打印出hashmap时,它没有显示7分钟的所有结果。相反它显示最后一个条目的结果7次。我已经尝试了很多来解决问题,但无法解决问题.Plzz帮助我

这是我的代码

public class Analysis
{
    public static class KeepTime
    {
        String time;
        long TotalSize;
    }

    Main f1 = new Main();
    public static int j = 0;
    public static int check = 0;
    public HashMap<String, KeepTime> hMap_time = new HashMap<String, KeepTime>();
    public KeepTime TimerInstance = new KeepTime();

    void TimeBasedReporting()
    {
        String skey;
        String key;
        int k;
        int y;

        for (k = 1; k <= f1.Flows().size(); k++)
        {
            check = 0;
            j = 0;

            skey = Integer.toString(k);

            if (hMap_time.isEmpty())
            {
                //some code
                key = Integer.toString(hMap_time.size() + 1);
                hMap_time.put(key, TimerInstance);
                j = 1;
            }
            else if (check == 0 && j == 0)
            {
                for (y = 1; y <= hMap_time.size(); y++)
                {
                    //some code
                    }
                }
            }

            if (check == 0 && j == 0)
            {
                // some code
                key = Integer.toString(hMap_time.size() + 1);
                hMap_time.put(key, TimerInstance);
            }
            else
            {}


        }



    }
}

以下是输出

          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424
          03:08:39,AM  424

3 个答案:

答案 0 :(得分:2)

您正在创建KeepTime单个实例,并使用对该对象的引用作为各种键/值对中的值。

如果您希望它们独立,则每次添加新条目时都应创建 new 实例。 (是的,我同意你几乎肯定想要一张地图的评论 - 但如果你多次向列表添加相同的引用,你也会遇到同样的问题。 )

答案 1 :(得分:1)

问题是您使用的是TimerInstance并将其放在地图中的每个键

您将同一个对象与所有键相关联,因此当然您将在地图中存储相同的值。

尝试:

KeepTime timer = new KeepTime();

位于for循环的顶部,并将所有TimerInstance替换为timer

您可以执行此操作,而无需在每次将其存储在地图中时重新分配原始TimerInstance的所有成员时更改逻辑。

此外,如果您希望条目按升序排列,则HashMap会根据键的哈希码(在本例中为String)为您提供错误的顺序。如果您需要正确的排序,请使用TreeMap - 默认字符串比较按字母顺序排序,或者您可以指定自己的自定义Comparator以提供所需的排序。

答案 2 :(得分:0)

迭代地图条目的方法是迭代其map.keySet()map.entrySet()。使用其中之一。