提问者:小点点

为什么HashMap不适合整数键的大数据集?


我有一个非空数组,给出了由N个整数组成的数组。该数组包含奇数个元素,数组的每个元素都可以与另一个具有相同值的元素配对,除了一个元素未配对。

例如,在数组A中,如下所示:

A[0] = 9 , A[1] = 3 , A[2] = 9 , A[3] = 3 , A[4] = 9 , A[5] = 7 , A[6] = 9

我需要编写一个函数来返回未配对元素的值。

我的第一个本机解决方案之一是创建一个具有唯一键的hashmap结构——给定数组的N个整数,如果键已经存在于hashmap中,则遍历数组添加值。毕竟,在值字段中只有1的键是未配对的元素。

我知道Integer的hashcode是它的int唯一值…所以我soposed,不会出现不同Integer的重复键…所以我假设,不会出现不同Integer的重复键…但对于一个大的数据集,这个解决方案不起作用…我认为这与负载因子有关。但我上不去。我不需要替代解决方案,因为我已经有了它,我只是想了解当我们使用一大套整数键时hashmap有什么问题…这是我的代码,非常感谢!:Map a=new HashMap();

       for(int i=0;i<A.length;i++) {

           if(a.containsKey(A[i])){
               a.put(A[i], a.get(A[i])+1);     
           }else  a.put(A[i], 1);      

       }

       for (Integer i : a.keySet()) {
              if(a.get(i)==1)
                  return i;
            }

       return -1;

在此处输入图像描述


共1个答案

匿名用户

我认为这与负载系数有关。

不,问题不在于HashMap,而在于您使用它的方式。

您的解决方案不完整,因为它假设所有对都是唯一的。即它假设最多可以有一对9(在您发布的示例中不正确,其中包含2对9)。

有多个相同的配对不一定会导致错误的答案,但是如果,例如,有3个9,其中两个是配对的,但第3个不是呢?您的解决方案找不到它,因为a. get(9)会返回3,但是您检查它是否等于1

而不是检查

if(a.get(i)==1)

你应该检查一下是否奇怪

if(a.get(i)%2==1)