HashMap containsKey为Integer返回false

时间:2017-04-05 10:38:07

标签: java hashmap integer containskey

我有这个简单的代码,我发现对于最后一个数组,containsKey方法总是返回false。

int[] indices = new int[] { 1, 3, 5, 7, 9 };

Map<Integer, Integer> seen = new HashMap<>();

for (int i = 0; i < indices.length - 1; i++) {
    seen.put(indices[i], i);
}

除了以下所有其他情况:

System.out.println("!!!!! " + seen.containsKey(9) );

还有新的

int[] { 1, 3, 5, 7 };

除了以下所有其他情况:

System.out.println("!!!!! " + seen.containsKey(7) );

这背后的逻辑是什么?

7 个答案:

答案 0 :(得分:6)

在for循环中

for (int i = 0; i < indices.length - 1; i++) 

将条件更改为i <= indices.length - 1 或其他选择是使用i < indices.length

在您的代码中,您只是将数组的最后一个元素添加到地图中。

答案 1 :(得分:5)

您不会将indices数组的最后一个元素放在Map中。

更改

for (int i = 0; i < indices.length - 1; i++) {
    seen.put(indices[i], i);
}

for (int i = 0; i < indices.length; i++) {
    seen.put(indices[i], i);
}

答案 2 :(得分:1)

看看你的for循环:

sudo ln -s /usr/bin/llvm-symbolizer-3.8 /usr/bin/llvm-symbolizer

for循环中的条件错误。用&lt; indices.length -1 您实际上只将前4个键放入地图中。它应该是

llvm-symbolizer-4.0

for (int i = 0; i < indices.length - 1; i++) {

答案 3 :(得分:0)

使用以下内容填充地图后:

    for (int i = 0; i < indices.length - 1; i++) {
        seen.put(indices[i], i);
    }

它看起来像:

    {1=0, 3=1, 5=2, 7=3}

所以你问地图是否有一个值为9的键....

答案是正确的,它没有......

答案 4 :(得分:0)

因为你的代码循环从0开始,你的最后一个键是(indices.length -1)。

答案 5 :(得分:0)

似乎你没有添加最后的元素,你的循环运行直到少于长度 - 1.简单地删除-1

for (int i = 0; i < indices.length; i++) {
seen.put(indices[i], i);
}

或使用小于等于

for (int i = 0; i <= indices.length - 1; i++) {
seen.put(indices[i], i);
}

它不是containsKey的问题,get也不会给你带来价值,因为永远不会添加最后一个元素。

答案 6 :(得分:0)

只是我的两分钱:这是避免这些问题的功能版本:

int[] indices = new int[] {1, 3, 5, 7, 9};

Map<Integer, Integer> map = IntStream.range(0, indices.length)
         .mapToObj(i -> {
           return new int[] {i, indices[i]};
         })
         .collect(Collectors.toMap(i -> i[1], i -> i[0]));