官术网_书友最值得收藏!

2.4 循環控制

實例032 使用while與自增運算符循環遍歷數組

光盤位置:光盤\MR\02\032

高級

實用指數:

實例說明

本實例利用自增運算符結合while循環獲取每個數組元素的值,然后把它們輸出到控制臺中。其中自增運算符控制索引變量的遞增,實例運行結果如圖2.17所示。

圖2.17 實例運行結果

設計過程

創建ErgodicArray類,在該類的主方法中創建一個鳥類數組,然后創建一個索引變量,這個變量用于指定數組下標,隨著該索引的遞增,while循環會逐步獲取每個數組的元素并輸出到控制臺中,關鍵代碼如下:

        public class ErgodicArray{
            public static void main(String[]args){
              //創建鳥類數組
              String[]aves=new String[]{"白鷺", "丹頂鶴", "黃鸝", "鸚鵡", "烏鴉", "喜鵲",
                      "布谷鳥", "灰紋鳥", "百靈鳥" };
              int index=0; //創建索引變量
              System.out.println("我的花園里有很多鳥,種類大約包括:");
              while(index<aves.length){//遍歷數組
                  System.out.println(aves[index++]); //自增索引值
              }
            }
        }

秘笈心法

自增自減運算符分前置與后置兩種,其中前置運算如“++index”會先將index的值遞增,然后再使用遞增后的值;而后置運算如“index++”會首先使用該變量的值,然后再把變量值遞增。

實例033 使用for循環輸出楊輝三角

光盤位置:光盤\MR\02\033

高級

實用指數:

實例說明

楊輝三角由數字排列,可以把它看作一個數字表,其基本特性是兩側數值均為1,其他位置的數值是其正上方的數值與左上角數值之和。本實例通過數組來實現這個楊輝三角,其運行結果如圖2.18所示。

圖2.18 楊輝三角

設計過程

創建YanghuiTriangle類,在該類的主方法中創建一個二維數組,并指定二維數組的第一維長度,這個數組用于存放楊輝三角的數值表,再通過雙層for循環來實現第二維數組的長度,然后計算整個數組的每個元素的值,程序關鍵代碼如下:

        public class YanghuiTriangle {
            public static void main(String[] args) {
              int triangle[][]=new int[8][]; //創建二維數組
              //遍歷二維數組的第一層
              for (int i = 0; i < triangle.length; i++) {
                  triangle[i]=new int[i+1]; //初始化第二層數組的大小
                  //遍歷第二層數組
                  for(int j=0; j<=triangle[i].length-1; j++){
                      //將兩側的數組元素賦值為1
                      if(i==0||j==0||j==triangle[i].length-1){
                          triangle[i][j]=1;
                      }else{//其他數值通過公式計算
                          triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
                      }
                      //輸出數組元素
                      System.out.print(triangle[i][j]+"\t");
                  }
                  System.out.println();
              }
            }
        }

秘笈心法

Java語言中的二維數組其實是一維數組的每個元素都是另一個一維數組,所以第二維數組的長度可以任意,就像本實例中那樣。這比其他語言的數組更靈活,而且多維數組也是如此。

實例034 使用嵌套循環在控制臺上輸出九九乘法表

高級

實用指數:

光盤位置:光盤\MR\02\034

實例說明

Java基本語法中的for循環非常靈活并且可以嵌套使用,其中雙層for循環是程序開發中使用最頻繁的,常用于操作表格數據。對于行數與列數相同的表格操作代碼比較簡單,但是類似九九乘法表就不好控制了,因為它的列數要與行數對應,可以說這個表格是個三角形。本實例通過雙層循環輸出了這個九九乘法表,效果如圖2.19所示。(在面試與等級考試中常出現這類題目)

圖2.19 九九乘法表

設計過程

創建MultiplicationTable類,在該類的主方法中創建雙層for循環,第一層for循環也稱為外層循環,它用于控制表格的行;第二層循環也稱為內層循環,它用于控制表格的列。這里第二層循環的控制變量非常重要,它的條件判斷是列數要等于行數的最大值,然后輸出內層與外層循環控制變量的乘積,這樣就實現了九九乘法表,程序關鍵代碼如下:

        public class MultiplicationTable {
            public static void main(String[] args) {
                for(int i=1; i<=9; i++){//循環控制變量從1遍歷到9
                    for(int j=1; j<=i; j++){//第二層循環控制變量與第一層最大索引相等
                      //輸出計算結果但不換行
                      System.out.print(j+"*"+i+"="+i*j+"\t");
                    }
                    System.out.println(); //在外層循環中換行
                }
            }
          }

秘笈心法

循環語句可以完成復雜的運算,也可以用于控制程序的遞歸流程,而多層循環可以實現更加復雜的業務邏輯,是學習編程必須掌握的一種應用。在處理有規則的大量數據時,應該考慮使用多層循環來優化程序代碼,但是建議添加詳細的代碼注釋,便于以后的維護與修改工作。

實例035 用while循環計算1+1/2!+1/3!…1/20!

光盤位置:光盤\MR\02\035

高級

實用指數:

實例說明

本實例在計算階乘的算法之上應用while循環語句計算1+1/2!+1/3!…1/20!的和。如果使用基本數據類型double是無法精確地顯示運算結果的,所以本實例使用了BigDecimal類的實例來完成這個運算,實例運行結果如圖2.20所示。

圖2.20 實例運行結果

說明:由于本實例的運行結果精度非常高,小數位數過長,所以設置了特殊的控制臺執行,讀者的運行結果可能是單行的數字。

設計過程

創建Example類,在該類的主方法中創建保存總和的sum變量和計算階乘的factorial變量,為保證計算結果的精度,這兩個變量都是BigDecimal類的實例對象。然后通過while實現20次循環,并完成計算,程序代碼如下:

        import java.math.BigDecimal;
        public class Example {
            public static void main(String args[]) {
              BigDecimal sum=new BigDecimal(0.0);                                      //和
              BigDecimal factorial=new BigDecimal(1.0);                                //階乘項的計算結果
              int i=1;                                                                 //循環增量
              while (i <= 20) {
                  sum=sum.add(factorial);                                              //累加各項階乘的和
                  ++i;                                                                 //i加1
                  factorial=factorial.multiply(new BigDecimal(1.0/i));                 //計算階乘項
              }
              System.out.println("1+1/2! +1/3! …1/20!的計算結果等于:\n"+sum);           //輸出計算結果
            }
        }

秘笈心法

對于高精度要求或者運算數較大的計算,應該使用BigDecimal類實現,否則Java基本類型的數據無法保證浮點數的精度,也無法對超出其表示范圍的數字進行運算。

實例036 用for循環輸出空心的菱形

光盤位置:光盤\MR\02\036

高級

實用指數:

實例說明

本實例在輸出菱形的基礎上加大難度,輸出空心的菱形圖案,在等級考試與公司面試時出現過類似題目。本實例的目的在于熟練掌握for循環的嵌套使用,實例運行結果如圖2.21所示。

圖2.21 實例運行結果

設計過程

創建Diamond類,在該類的主方法中調用printHollowRhombus()方法完成10行的空心菱形輸出,其中printHollowRhombus()方法是實例中自定義的,該方法使用兩個雙層for循環分別輸出菱形的上半部分與下半部分,程序關鍵代碼如下:

        public class Diamond {
            public static void main(String[] args) {
              printHollowRhombus(10);
            }
            public static void printHollowRhombus(int size) {
              if (size % 2 == 0) {
                  size++; //計算菱形大小
              }
              for (int i = 0; i < size / 2 + 1; i++) {
                  for (int j = size / 2 + 1; j > i + 1; j--) {
                      System.out.print(""); //輸出左上角位置的空白
                  }
                  for (int j = 0; j < 2 * i + 1; j++) {
                      if (j == 0 || j == 2 * i) {
                          System.out.print("*"); //輸出菱形上半部邊緣
                      } else {
                          System.out.print(""); //輸出菱形上半部空心
                      }
                  }
                  System.out.println("");
              }
              for (int i = size / 2 + 1; i < size; i++) {
                  for (int j = 0; j < i - size / 2; j++) {
                      System.out.print(""); //輸出菱形左下角空白
                  }
                  for (int j = 0; j < 2 * size -1-2 * i; j++) {
                      if (j == 0 || j == 2 * (size - i -1)) {
                          System.out.print("*"); //輸出菱形下半部邊緣
                      } else {
                          System.out.print(""); //輸出菱形下半部空心
                      }
                  }
                  System.out.println("");
              }
            }
        }

秘笈心法

for循環中有3個表達式,這3個表達式都是可選的,也就是說for循環可以沒有表達式。例如,for(;;)這樣的for循環將是一個無限循環,讀者在使用for循環時應注意避免無限循環。

實例037 foreach循環優于for循環

光盤位置:光盤\MR\02\037

高級

實用指數:

實例說明

JDK 1.5為Java添加了新的for循環foreach。它是原有for循環遍歷數據的一種簡寫形式,使用的關鍵字依然是for,但是參數格式不同。本實例使用foreach循環分別遍歷集合對象與數組,并把元素輸出到控制臺,實例運行結果如圖2.22所示。

圖2.22 實例運行結果

關鍵技術

foreach循環是for循環的一種簡寫格式,只用于遍歷數據集合或數組,其語法格式如下:

        for ( Type e : collections ) {
            //對變量e的使用
        }

參數說明

? e:其類型Type是集合或數組中元素值的類型,該參數是集合或數組collections中的一個元素。

? collections:要遍歷的集合或數組,也可以是迭代器。

說明:在循環體中使用參數e,該參數是foreach從集合或數組以及迭代器中取得的元素值,元素值是從頭到尾進行遍歷的。

設計過程

創建UseForeach類,在該類的主方法中創建List集合對象,并為該對象添加內容,然后使用foreach循環遍歷該集合輸出所有內容,再從List集合中提取一個字符串數組,最后使用foreach循環遍歷該數組,并將所有數組元素輸出到控制臺,程序關鍵代碼如下:

        import java.util.ArrayList;
        import java.util.List;
        public class UseForeach {
            public static void main(String[] args) {
              List<String> list=new ArrayList<String>(); //創建list集合
              list.add("abc"); //初始化list集合
              list.add("def");
              list.add("hij");
              list.add("klm");
              list.add("nop");
              list.add("qrs");
              System.out.print("foreach遍歷集合:\n\t");
              for (String string : list) {//遍歷list集合
                  System.out.print(string); //輸出集合的元素值
              }
              System.out.println();
              String[] strs=new String[list.size()];
              list.toArray(strs); //創建數組
              System.out.print("foreach遍歷數組:\n\t");
              for (String string : strs) {//遍歷數組
                  System.out.print(string); //輸出數組元素值
              }
            }
        }

秘笈心法

在JDK 1.5之前使用for循環對集合、數值和迭代器進行遍歷,這需要創建索引變量、條件表達式,這些會使代碼造成混亂,并增加出錯的幾率,并且每次循環中索引變量或迭代器都會出現3次,有兩次出錯的機會。而且會有一些性能損失,其性能稍微落后于foreach循環。所以對于數據集合的遍歷,建議使用foreach循環完成。

實例038 終止循環體

光盤位置:光盤\MR\02\038

高級

實用指數:

實例說明

循環用于復雜的業務處理可以提高程序的性能和代碼的可讀性,但是循環中也有特殊情況,如由于某些原因需要立刻中斷循環去執行下面的業務邏輯,本實例運行結果如圖2.23所示。

圖2.23 實例運行結果

設計過程

在Eclipse中創建一個Java項目,在項目中創建BreakCyc類,在該類的主方法中創建一個字符串數組,在使用foreach遍歷時,判斷如果發現數組中包含字符串“老鷹”則立刻中斷循環。再創建一個整數類型二維數組,使用雙層foreach循環遍歷,當發現第一個小于60的數組元素,則立刻中斷整個雙層循環,而不是內層循環,程序關鍵代碼如下:

        public class BreakCyc {
            public static void main(String[] args) {
              System.out.println("\n-------------中斷單層循環的例子。-------------");
              //創建數組
              String[] array = new String[] { "白鷺", "丹頂鶴", "黃鸝", "鸚鵡", "烏鴉", "喜鵲",
                      "老鷹", "布谷鳥", "老鷹", "灰紋鳥", "老鷹", "百靈鳥" };
              System.out.println("在你發現第一只老鷹之前,告訴我都有什么鳥。");
              for (String string : array) {//foreach遍歷數組
                  if (string.equals("老鷹"))//如果遇到老鷹
                      break; //中斷循環
                  System.out.print("有:"+string+"        "); //否則輸出數組元素
              }
              System.out.println("\n\n-------------中斷雙層循環的例子。-------------");
              //創建成績數組
              int[][] myScores = new int[][] { { 67, 78, 63, 22, 66 },
                      { 55, 68, 78, 95, 44 }, { 95, 97, 92, 93, 81 } };
              System.out.println("寶寶這次考試成績:\n數學\t語文\t英語\t美術\t歷史");
              No1: for (int[] is : myScores) {//遍歷成績表格
                  for (int i : is) {
                      System.out.print(i+"\t"); //輸出成績
                      if (i < 60) {//如果中途遇到不及格的,立刻中斷所有輸出
                          System.out.println("\n等等,"+i+"分的是什么?這個為什么不及格?");
                          break No1;
                      }
                  }
                  System.out.println();
              }
            }
        }

秘笈心法

充分利用循環可以提高程序的開發與執行效率,但是如果不注重循環中的算法很容易導致程序的死循環,那將是程序的死穴。所以在循環體中要對可能出現的特殊情況使用break語句中斷循環。

實例039 循環體的過濾器

光盤位置:光盤\MR\02\039

高級

實用指數:

實例說明

循環體中可以通過break語句中斷整個循環,這增加了循環的控制能力,但是對于特殊情況還是不夠。例如,某些條件下需要放棄部分循環處理,而不是整個循環體。Java提供了continue語句來實現這一功能,continue可以放棄本次循環體的剩余代碼,不執行它們而開始下一輪的循環。本實例利用continue語句實現了循環體過濾器,可以過濾“老鷹”字符串,并做相應的處理,但是放棄continue語句之后的所有代碼,實例運行結果如圖2.24所示。

圖2.24 實例運行結果

設計過程

在Eclipse項目中創建CycFilter類,在該類的主方法中創建鳥類名稱的字符串數組,其中包含多個“老鷹”字符串,然后通過foreach循環遍歷該數組,在循環過程中如果遍歷的數組元素是“老鷹”字符串,則輸出發現老鷹的信息并過濾循環體之后的所有代碼,關鍵代碼如下:

        public class CycFilter {
            public static void main(String[] args) {
              //創建數組
              String[] array = new String[] { "白鷺", "丹頂鶴", "黃鸝", "鸚鵡", "烏鴉", "喜鵲",
                      "老鷹", "布谷鳥", "老鷹", "灰紋鳥", "老鷹", "百靈鳥" };
              System.out.println("在我的花園里有很多鳥類,但是最近來了幾只老鷹,請幫我把它們抓走。");
              int eagleCount = 0;
              for (String string : array) {//foreach遍歷數組
                  if (string.equals("老鷹")) {//如果遇到老鷹
                      System.out.println("發現一只老鷹,已經抓到籠子里。");
                      eagleCount++;
                      continue; //中斷循環
                  }
                  System.out.println("搜索鳥類,發現了:"+string); //否則輸出數組元素
              }
              System.out.println("一共捉到了:"+eagleCount+"只老鷹。");
            }
        }

秘笈心法

break語句和continue語句都是對循環體的控制語句,它們不僅應用于for循環,而且在任何循環體中也可以使用這些語句,靈活使用可以讓循環實現更加復雜的運算和業務處理。

實例040 循環的極限

光盤位置:光盤\MR\02\040

高級

實用指數:

實例說明

循環是常用的開發模式,它可以簡化業務處理,提高代碼編寫與程序運行效率,但是要熟練掌握循環中的控制算法,否則容易造成死循環導致程序崩潰。本實例將介紹一個Java語言中很難發現的導致程序死循環的實例,本實例使用int整數類型作為循環索引變量,也是循環控制變量,用它來控制循環的次數,測試當這個程序的條件是索引小于等于變量類型的最大值時會發生什么。

設計過程

創建CycUtmost類,在該類的主方法中創建int整數類型的變量end,使其等于整數類型的最大值,然后用該值減去50開始作為循環的起始點,條件是循環控制變量小于等于end變量,在循環體中累加循環計數器,最后循環結束時顯示這個計數器,代碼如下:

        public class CycUtmost {
            public static void main(String[] args) {
              int end=Integer.MAX_VALUE; //定義循環終止數
              int start=end-50; //定義循環起始數
              int count=0; //定義循環計數器
              for (int i = start; i <= end; i++) {//執行循環
                  count++; //循環計數
              }
              //輸出循環計數器
              System.out.println("本次循環次數為:"+count);
            }
        }

技巧:讀者可能會認為這個程序會循環至少50次,然后輸出計數器的值,但實際上這個程序的運行結果會導致死循環,因為控制條件是索引小于等于整數類型的最大值,當整數類型達到其最大值再累加1時會回到整數類型的最小值,所以它永遠不可能大于end變量,這樣就導致了程序的死循環,所以在程序開發時要注意控制變量的取值范圍。

秘笈心法

Java基本數據類型都有其取值范圍,熟悉二進制原理的讀者應該能夠理解,當超出取值范圍時,數值會被截取。例如,本實例中的循環控制變量超出整數類型的最大取值范圍時,就會繞回整數類型的最小值。所以在進行條件判斷涉及取值邊界時,要考慮這個因素。

主站蜘蛛池模板: 习水县| 泰来县| 鹤壁市| 萍乡市| 崇文区| 鄄城县| 阿坝县| 新晃| 司法| 柳河县| 沅陵县| 延安市| 梁河县| 高陵县| 井陉县| 定结县| 扶风县| 和田市| 哈密市| 安西县| 南宁市| 鹿邑县| 余江县| 武宣县| 古交市| 景泰县| 西青区| 黑水县| 密山市| 蓝山县| 河曲县| 彭山县| 开鲁县| 邹平县| 延庆县| 湘潭县| 鸡东县| 利津县| 郎溪县| 合川市| 沧州市|