如何使用hashmap跟踪和增加重复项计数

时间:2014-03-18 06:19:09

标签: java arraylist map

我的程序非常简单。我需要做的就是跟踪重复项并分别打印唯一和重复元素。我正在使用哈希映射。 (dup是包含所有元素的arraylist)

    Map<Employee, Integer> newMap = new HashMap();
    int count = 0;
    for (Employee element : dup) {

        System.out.println("oooo" + element);
        if (newMap.put((Employee) element, count) != null) {
            newMap.put((Employee) element, newMap.get(element) + 1);
        }
    }
    System.out.println("oooo" + newMap);

产生的o / p是:

    Employee No :9 Employee Name :Swasti Employee MailId :swasti@gmail.com=0, Employee No :2 Employee Name :Shanthi Employee MailId :shanthi@gmail.com=0

带有重复项的记录会增加,而o / p则为:

    Employee Name :Shreya Employee MailId :shreya@gmail.com=1, Employee Name :Sujatha Employee MailId :suravich@gmail.com=1

这里的问题是,对于具有更多重复项的记录,计数不会增加多于一个。我不明白为什么。任何形式的帮助将不胜感激。

P.S:我尝试用arraylist和hashset做这个,但确实得到了输出但是使用地图似乎是一种更好的方法。

3 个答案:

答案 0 :(得分:1)

这是因为这一行:

if (newMap.put((Employee) element, count) != null) {

每次再次输入0(因为count在代码中始终为0)。在下一行,您的newMap.get(element)将为0 ...

您需要获取旧值并检查它是否为空:

Integer oldValue = newMap.put((Employee) element, 0);
if (oldValue != null)
    newMap.put((Employee) element, oldValue + 1);

请注意,您的dup应该是List<Employee>,而不是原始List。这样可以避免你当前要进行的所有演员表。

答案 1 :(得分:0)

        if (newMap.containsKey(element)) {
            newMap.put(element, newMap.get(element) + 1);
        }

此外,由于您使用泛型,您需要进行类型转换。

答案 2 :(得分:0)

if (newMap.get(element) != null) {
    newMap.put(element, newMap.get(element) + 1);
} else {
    newMap.put(element, 1);
}