HashMap containsKey returns false for Integer
HashMap containsKey returns false for Integer
我有这个简单的代码,我发现对于最后一个数组编号,containsKey 方法 returns 始终为 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循环中的条件是错误的。使用 < indices.length -1 您实际上只将前 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 开始,你的最后一个键是 (indices.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);
}
这不是 containsKey 的问题,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]));
我有这个简单的代码,我发现对于最后一个数组编号,containsKey 方法 returns 始终为 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循环中的条件是错误的。使用 < indices.length -1 您实际上只将前 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 开始,你的最后一个键是 (indices.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);
}
这不是 containsKey 的问题,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]));