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