Java静态hashMap返回重复项

时间:2017-10-10 12:19:54

标签: java static hashmap iterator

我实际上不知道问题可能是什么,所以我根据我的标题命名 自己的直觉。 这个简单的程序旨在演示静态变量和方法以及hashMap演示。

检索到的重复值是无法应付的,为什么HashMap中存在重复? 每次添加后不应该通过静态hashMap迭代来识别可能的先前重复项并在功能上删除它们吗?

然后我尝试调用 removeDups 方法手动删除它们,此尝试也失败了。

代码:

public class Registration {

    public String name;
    public static int count;

    public static HashMap<Integer, Registration> listOfUsers = new HashMap<>();

    public static ArrayList finalList = new ArrayList<>();

    public Registration() {

    }

    public Registration(String name) {

        this.name = name;
        count++;
    }

    public static int getRegistered() {
        return count;
    }

    public void putUserInDB(String name) {
        listOfUsers.put(count, new Registration(name));

        removeDups();
        printUsers();

    }

    private static void removeDups() {

        for (Integer key1 : listOfUsers.keySet()) {
            for (Integer key2 : listOfUsers.keySet()) {
                if (!key1.toString().equals(key2.toString())) {
                    Registration x = listOfUsers.get(key1);
                    Registration y = listOfUsers.get(key2);
                    if (x == y) {
                        listOfUsers.remove(key2);
                    }

                }

            }
        }

    }

    private void printUsers() {
        for (HashMap.Entry<Integer, Registration> e : listOfUsers.entrySet()) {
            System.out.println(e.getKey());
            System.out.println(e.getValue());
        }
    }

    @Override
    public String toString() {
        return "Name: " + this.name;
    }
public class Test {

    public static void main(String[]args) {

        Registration r = new Registration();

        r.putUserInDB("Olga");
        r.putUserInDB("Maria");
        r.putUserInDB("Tatiana");

        System.out.println("No of registrations: " + r.getRegistered());
        System.out.println("__________________________________________");

        r.putUserInDB("Anastasia");
        r.putUserInDB("Aleksandra");

        System.out.println("No of registrations: " + r.getRegistered());
        System.out.println("__________________________________________");

        r.putUserInDB("Nikolai");
        r.putUserInDB("Aleksei");

        System.out.println("No of registrations: " + r.getRegistered());    
    }

输出:

0

姓名:奥尔加 0 姓名:奥尔加 1 姓名:玛丽亚 0 姓名:奥尔加 1 姓名:玛丽亚 2 姓名:塔蒂亚娜 没有注册:3

1 个答案:

答案 0 :(得分:4)

您的removeDups方法应该从HashMap中删除重复值。 HashMap可以包含重复值。您的具体HashMap具有唯一的Integer个密钥和Registration值,如果它们具有相同的名称,则可视为重复。

那就是说,removeDups()写的很糟糕。它会将值与==而不是equals进行比较,这意味着它永远不会删除任何内容。此外,如果您希望它返回equals,则必须覆盖Registration课程中的true

解决这些问题后,您可能会获得ConcurrentModificationException,因为在remove上进行迭代时,您不应Collection Collection(除非您使用显式{ {1}}并使用Iterator&#39; Iterator方法。

编辑:

正如Guy评论的那样,您的remove()方法也会调用putUserInDB(),它会打印所有已添加的用户。因此,一些用户将被多次打印。