java while 里嵌套 for 循环,在 for 里使用 continue 难道是跳出外层 while 的当次循环?? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
buptlee
V2EX    程序员

java while 里嵌套 for 循环,在 for 里使用 continue 难道是跳出外层 while 的当次循环??

  •  
  •   buptlee
    Xiaoxin2009 2014-09-04 09:49:44 +08:00 7616 次点击
    这是一个创建于 4056 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的程序是在while循环里面有个for循环,dist_matrix是一个 HashMap<Integer,ArrayList<Integer>> clusterSet = new HashMap<Integer,ArrayList<Integer>>(3200000);
    程序的目的是要对每一个key-value对进行更新,代码在下面,逻辑很简单,就是对每个键的值(一个list)进行更新:
    1,如果不包含user1和user2,list不变.
    2,如果包含user1或者user2中的一个,把这个节点改成user1.
    3, 如果既包含user1又包含user2,则保留第一次遇到的节点,并把标识换成user1,删除第二次遇到的节点。
    说说我遇到的奇怪的问题。有一个key-value对是这样的:
    the user1 and user2 are : 2,105529

    the value of 116615 is : 2-0,105529-0,1132145-0,1946439-0,2155282-0,2854-1,46590-1,449056-1,491556-1,693681-1,

    the first time occurs in the key : 116615
    the first time occurs in the key : 116615, the item is user1 : 2

    start to check the value of : 116615

    the modified value of 116615 is : 2-0,105529-0,1132145-0,1946439-0,2155282-0,2854-1,46590-1,449056-1,491556-1,693681-1,

    按逻辑来看修改后的116615的值应该是没有第二项105529-0的,应为这是第二次遇到(user2),应该是被删除了,至少应该打这条log吧:
    System.out.println("the second time occurs in the key : "+key+", the item is : "+node.getImsi());
    但是没有,说明这个地方的逻辑都没执行进来,查看代码,实在找不出问题,我想问问各位对java的逻辑控制熟悉的同学,是我的逻辑写错了,还是问题出在continue那里?continue直接就跳出整个for循环,去执行下次while循环了,虽然听起来有点不可思议,但是我实在想不出别的解释啊,谢谢各位了,帮小弟看看。

    boolean IsExist = false;
    Iterator<Integer> iter = dist_matrix.keySet().iterator();
    while (iter.hasNext()) {
    IsExist=false;
    Integer key = iter.next();
    LinkedList<Node> value = dist_matrix.get(key);
    String check_str = "";
    for(Node node : value){
    check_str=check_str+node.getImsi()+"-"+node.getDist()+",";
    }
    System.out.println("the user1 and user2 are : "+user1+","+user2);
    System.out.println("the value of "+key+" is : "+check_str);

    for(int i = 0;i<value.size();i++){
    Node node = value.get(i);
    if((user1==node.getImsi() || user2==node.getImsi())&&(IsExist)){
    System.out.println("the second time occurs in the key : "+key+", the item is : "+node.getImsi());
    value.remove(node);
    }
    if((user1==node.getImsi() || user2==node.getImsi())&&(!IsExist)){
    System.out.println("the first time occurs in the key : "+key);
    if(user1==node.getImsi()){
    IsExist = true;
    System.out.println("the first time occurs in the key : "+key+", the item is user1 : "+user1);
    continue;
    }
    else{
    System.out.println("the first time occurs in the key : "+key+", the item is user2 : "+user2);
    node.setImsi(user1);
    IsExist = true;
    continue;
    }
    }
    }

    System.out.println("start to check the value of : "+check);
    String modified_check_str = "";
    LinkedList<Node> modified_value = dist_matrix.get(check);
    for(Node node : modified_value){
    modified_check_str=modified_check_str+node.getImsi()+"-"+node.getDist()+",";
    }
    System.out.println("the modified value of "+check+" is : "+modified_check_str);
    24 条回复    2014-09-06 22:45:35 +08:00
    hcymk2
        1
    hcymk2  
       2014-09-04 09:57:57 +08:00   1
    LZ 你旁边有java语法书么?
    buptlee
        2
    buptlee  
    OP
       2014-09-04 10:00:21 +08:00
    @hcymk2 有啊,headfirst java。。。。我哪儿错了啊,bro.
    buptlee
        3
    buptlee  
    OP
       2014-09-04 10:07:47 +08:00
    @hcymk2 是我犯了低级错误了吗?
    hcymk2
        4
    hcymk2  
       2014-09-04 10:23:33 +08:00   1
    @buptlee 先不说continue 想先问下Node的Imsi是什么数据类型?
    buptlee
        5
    buptlee  
    OP
       2014-09-04 10:24:32 +08:00
    @hcymk2
    class Node implements Comparable<Node>{

    Integer imsi;
    Integer dist;

    public int compareTo(Node s){
    return dist.compareTo(s.getDist());
    }

    public Node(){
    imsi = -1;
    dist = Integer.MAX_VALUE;
    }

    public Node(Integer imsiNo,int distance){
    imsi = imsiNo;
    dist = distance;
    }

    public int getDist(){
    return dist;
    }

    public Integer getImsi(){
    return imsi;
    }

    public void setImsi(Integer _imsi){
    imsi = _imsi;
    }
    }
    hcymk2
        6
    hcymk2  
       2014-09-04 10:34:03 +08:00   1
    把== 都改成equals()先
    davepkxxx
        7
    davepkxxx  
       2014-09-04 10:34:50 +08:00   1
    out: for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
    if (j == 5) {
    continue out;
    }
    }
    }
    buptlee
        8
    buptlee  
    OP
       2014-09-04 10:38:30 +08:00
    @hcymk2 我擦,是不是:
    int a =3;
    Integer b = 3;
    boolean c =(a==b);
    c会是false?
    谢谢哥们儿提示,真是nice。我太蠢了,唔。
    buptlee
        9
    buptlee  
    OP
       2014-09-04 10:40:55 +08:00
    您说的是continue的go to 用法是吧,不是这个问题啦,continue还是 终止的是最内层循环。是我数据类型弄错了,不过java这点也太tricky了吧。
    hcymk2
        10
    hcymk2  
       2014-09-04 10:50:58 +08:00   1
    那个等于,对刚接触java,而有其他语言经验的人来说有时确实是个坑,没办法的事情。
    buptlee
        11
    buptlee  
    OP
       2014-09-04 10:54:05 +08:00
    嗯,thanks。一不小心就没注意这点,equals()会把两个参数进行类型转换之后再比较是吗?
    ioth
        12
    ioth  
       2014-09-04 11:22:45 +08:00   1
    java很强大的,不要内存管理,不要指针,但是类型是强类型。
    还得要N多包包,果然是开发智能硬件的利器.
    hcymk2
        13
    hcymk2  
       2014-09-04 11:32:30 +08:00   1
    @buptlee equals() 在Object 里面是直接return (this == obj);
    其他的子类一般都会重写这个方法 ,就看是怎么重写的了。
    像Integer 就是
    if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
    }
    return false;
    buptlee
        14
    buptlee  
    OP
       2014-09-04 11:33:58 +08:00
    @hcymk2 cool!
    buptlee
        15
    buptlee  
    OP
       2014-09-04 11:38:44 +08:00
    @ioth 嗯嗯,我还是怪我学的不好,还在用c++的思维在编java
    ioth
        16
    ioth  
       2014-09-04 11:42:19 +08:00   1
    @buptlee 看看什么初学java的常见10个还是20个错误吧。
    ioth
        17
    ioth  
       2014-09-04 11:43:32 +08:00   1
    java风格喜欢用函数,不喜欢操作符,所谓封装好。
    vainly
        18
    vainly  
       2014-09-04 12:09:09 +08:00   1
    @buptlee continue是跳过“本次”循环进行下次循环,break结束当前循环。
    davepkxxx
        19
    davepkxxx  
       2014-09-04 13:03:10 +08:00   1
    如果想避免写java常犯的错误,建议买一本Effective Java看看。
    buptlee
        20
    buptlee  
    OP
       2014-09-04 14:36:33 +08:00
    @davepkxxx项目进度太快了,来不及看这种书哇,都是摸索着前进。等项目结束了再看
    ofisheye315
        21
    ofisheye315  
       2014-09-05 08:55:39 +08:00   1
    多层循环中使用break/continue 推荐用标记
    outer:for(int i = 0; i < 10; i++) {
    inner:while(flag){
    //do sth
    continue outer;
    }
    }
    ioth
        22
    ioth  
       2014-09-05 16:15:23 +08:00   1
    @buptlee 磨刀不误。
    buptlee
        23
    buptlee  
    OP
       2014-09-06 22:44:59 +08:00
    @ofisheye315 又学到一招,简直不谈,。
    buptlee
        24
    buptlee  
    OP
       2014-09-06 22:45:35 +08:00
    @ioth 嗯,京东已经同意配送了,嘿嘿
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2601 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 10:42 PVG 18:42 LAX 03:42 JFK 06:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86