我实际上不知道问题可能是什么,所以我根据我的标题命名 自己的直觉。 这个简单的程序旨在演示静态变量和方法以及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
答案 0 :(得分:4)
您的removeDups
方法应该从HashMap
中删除重复值。 HashMap
可以包含重复值。您的具体HashMap
具有唯一的Integer
个密钥和Registration
值,如果它们具有相同的名称,则可视为重复。
那就是说,removeDups()
写的很糟糕。它会将值与==
而不是equals
进行比较,这意味着它永远不会删除任何内容。此外,如果您希望它返回equals
,则必须覆盖Registration
课程中的true
。
解决这些问题后,您可能会获得ConcurrentModificationException
,因为在remove
上进行迭代时,您不应Collection
Collection
(除非您使用显式{ {1}}并使用Iterator
&#39; Iterator
方法。
编辑:
正如Guy评论的那样,您的remove()
方法也会调用putUserInDB()
,它会打印所有已添加的用户。因此,一些用户将被多次打印。