HashMap 包含 Key 为 Integer 返回 false



我有这个简单的代码,我发现对于最后一个数组编号,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) );

这背后的逻辑是什么?

你不会把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);
}

在 for 循环中

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

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

在您的代码中,您最多只将数组的倒数第二个元素添加到映射中。

看看你的 for 循环:

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

for 循环中的条件是错误的。使用 实际上,您只将前 4 个键放入映射中。它应该是

<= indices.length -1

< indices.length

用以下内容填充地图后:

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

它将看起来像:

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

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

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

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

似乎您没有添加最后一个元素,您的循环一直运行到小于长度 - 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);
}

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

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

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]));

相关内容

  • 没有找到相关文章

最新更新