zoukankan      html  css  js  c++  java
  • Effective Java 之-----for-each循环优于传统的for循环

    如下代码:

    enum Face {1,2,3,4,5,6};
    ......
    Collection<Face> faces = Array.asList(Face.values);
    for(Iterator<Face> i = faces.iterator();i.hasNext();){
    	for(Iterator<Face> j = faces.iterator();j.hasNext();){
    		System.out.println(i.next()+","+j.next());
    	}
    } 
    

    这个程序不会抛出异常,而是只打印6个重复的词(从"1,1"到"6,6"),而不是预计的36中组合,

    为修正这个bug,需要在外部循环的作用域中添加一个变量来保存外部变量,如下:

    for(Iterator<Face> i = faces.iterator();i.hasNext();){
    	Face bum = i.next();	
    	for(Iterator<Face> j = faces.iterator();j.hasNext();){
    		System.out.println(i.next()+","+j.next());
    	}
    } 
    

    如果是嵌套的for-each循环,这个问题就完全消失,产生的代码就是希望得到的:

    for(Suit suit: suits)
    	for(Rank rank: ranks)
    		deck.add(new Card(suit,rank));
    

    for循环不仅可以遍历数组和集合,还可以遍历任何实现Iterable接口的对象。
    (for(Suit suit:suits) 等价于 for(int i=0,a=suits.size();i<a;i++))

    有三种常见的情况无法使用for-each循环:
    1)过滤:需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用他的remove方法;
    2)转换:需要遍历列表或数组,并取代它部分或全部的元素值;
    3)平行迭代:需要并行的遍历多个集合

  • 相关阅读:
    [NOI2008] 糖果雨
    [NOI2006] 神奇口袋
    [NOI2014] 购票
    Prince and Princess HDU
    Network POJ
    CodeForces
    Codeforces Global Round 12
    Codeforces Round #688 (Div. 2)
    [USACO05DEC]Layout G
    # Technocup 2021
  • 原文地址:https://www.cnblogs.com/hunterCecil/p/5621337.html
Copyright © 2011-2022 走看看