为了账号安全,请及时绑定邮箱和手机立即绑定

HashMap/Hashtable 不返回 int 作为 for 循环中的键值

HashMap/Hashtable 不返回 int 作为 for 循环中的键值

扬帆大鱼 2022-01-12 14:24:05
当我尝试在 for 循环中访问 map.get(c) 时(如版本 2 所示),它返回空值并将上限设置为空,从而导致空指针异常。另一方面,如果我创建 end 变量并为其分配 map.get(c) 值(如版本 1 所示),它可以正常工作。那么,请你解释一下为什么?版本 1:工作得很好    int count=0;    int st=0;    string s = "abcabcbb";    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();    char[] str = s.toCharArray();    for(int i=0; i<str.length; i++){        char c = str[i];        if(map.get(c)==null){            map.put(c, i);            if(count < map.get(c) - st + 1){                count = map.get(c) - st + 1;            };        }        else {            int end = map.get(c);     // End variable --> returns int value as expected            for(int j=st; j<=end; j++){                map.remove(str[j]);                st = j+1;            }            map.put(c,i);        }    }    System.out.println(count);版本 2:给出空指针异常    int count=0;    int st=0;    string s = "abcabcbb";    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();    char[] str = s.toCharArray();    for(int i=0; i<str.length; i++){        char c = str[i];        if(map.get(c)==null){            map.put(c, i);            if(count < map.get(c) - st + 1){                count = map.get(c) - st + 1;            };        }        else {            //int end = map.get(c);     // End variable commented            for(int j=st; j<=map.get(c); j++){   // replaced end w map.get(c) --> returns null instead of int                map.remove(str[j]);                st = j+1;            }            map.put(c,i);        }    }    System.out.println(count);提前感谢您的帮助!罗汉。
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

一个 for 循环运行直到它的条件不满足(在你的情况下,直到j <= map.get(c)是false)。此条件也未缓存,如下面的代码输出所示:


public static void main(String[] args) {

    for (int i = 0; i < getCondition(); i++) {


    }

}


private static int getCondition() {

    System.out.println("Test");

    return 3;

}

输出:


Test

Test

Test

Test

出于这个原因,map.get(c)将在 for 循环的每次迭代中调用。如果您碰巧从 中删除了带有键的条目,c则从map返回的值Map#get是null,这就是导致NullPointerException.


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 173 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号