-1

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

这背后的逻辑是什么?

4

7 回答 7

6

您不会将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);
}
于 2017-04-05T10:39:24.013 回答
6

在 for 循环中

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

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

在您的代码中,您只将数组的倒数第二个元素添加到地图中。

于 2017-04-05T10:39:24.990 回答
1

看看你的 for 循环:

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

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

<= indices.length -1

或者

< indices.length
于 2017-04-05T10:42:17.803 回答
0

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

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

它看起来像:

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

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

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

于 2017-04-05T10:44:15.927 回答
0

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

于 2017-04-05T10:44:16.570 回答
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 也不会为您提供价值,因为永远不会添加最后一个元素。

于 2017-04-05T10:45:08.947 回答
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]));
于 2017-04-05T10:57:10.940 回答