我有下面的代码来检查不同对的总和是否等于一个数字。
static int numberOfPairs(int[] a, long k) {
Integer
Map<Integer,Integer> map = new HashMap<>();
int count =0;
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++) {
if(a[i]+a[j] == k){
if((!map.containsKey(a[i])) && (!map.containsKey(k-a[i]))) {
map.put(a[i], a[j]);
count++;
}
}
}
}
return count;
}
containskey方法不适用于以上代码,因为bcoz k的类型为long,但是如果我将long转换为int,则代码有效。
static int numberOfPairs(int[] a, long k) {
Integer
Map<Integer,Integer> map = new HashMap<>();
int count =0;
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++) {
if(a[i]+a[j] == k){
int x=(int)k-a[i];
if((!map.containsKey(a[i])) && (!map.containsKey(x))) {
map.put(a[i], a[j]);
count++;
}
}
}
}
return count;
}
Que:为什么它不能用于长类型?containsKey方法如何工作?
答案 0 :(得分:1)
map.containsKey(k-a [i])
这正在检查Long
中是否存在Map<Integer, Integer>
。即使数值恰好相同,也始终为假。
请注意,long
需要装箱才能用作containsKey(Object key)
的参数,但是它将自动装箱到Long
,而不是Integer
。
像Findbugs这样的静态代码检查器可能会警告您。如果泛型早已进入Java,那么这里甚至可能是the compile-time error you'd want。
map.containsKey((int)(k-a [i]))
现在您有一个int
,它将自动装箱到Integer
,并且可以使用。