1. 程式人生 > >跳轉語句 與 陣列基礎

跳轉語句 與 陣列基礎

 首先繼續來談一下迴圈:while迴圈、do…while迴圈、for each迴圈。

while迴圈

 與for迴圈一樣,while也是一個預測試的迴圈,但是while在迴圈開始之前,並不能確定重複執行迴圈開始語句序列的次數。while按不同的條件執行迴圈語句序列零次或多次。

  • 例:求1+2+……的和,值之和大於1000為止。
package kkzz;
public class SumWhile {
    public static void  main(String[] args) {
        int sum = 0;
        int i = 0;
        while (sum <= 10000){
            sum += i;
            i++;
        }
        System.out.printf("%d",sum);
    }
}
10011

do…while迴圈

 do語句按不同條件執行一次或多次迴圈語句序列。do…while迴圈的測試條件在執行完迴圈後執行,迴圈體至少執行一次,而while迴圈的迴圈體可能一次也不執行。
 do…while迴圈語句的格式:
do{
迴圈體語句序列;
}while(條件表示式);

  • 例:求1-100的和、奇數和、偶數和。
package com.k;
public class Dowhile {
 public static int sum(int n) {
        int sum = 0;
        int i = 1;
        do {
            sum = sum + i;
            i++;
        } while (i <= n);//1-100求和
        return sum;
    }

    public static int sumodd(int n) {
        int sumOdd = 0;
        int i = 1;
        do {
            sumOdd = sumOdd + i;
            i += 2;
        } while (i <= n);//1-100奇數求和
        return  sumOdd;
    }

    public static int sumeven(int n) {
        int sumEven = 0;
        int i = 2;
        do {
            sumEven = sumEven + i;
            i += 2;
        } while (i <= n);//1-100偶數求和
        return  sumEven;
    }
    public static void  main(String[] args) {
        System.out.println(sum(100));
        System.out.println(sumodd(100));
        System.out.println(sumeven(100));
    }
 }
5050
2500
2550

for each 語句

 用於迴圈訪問陣列或集合,以獲取所需資訊。基本語句格式:for(變數:資料或集合){ 迴圈體語句序列;}

跳轉語句

 跳轉語句用於無條件的轉移控制。使用跳轉語句執行分支,該語句會導致立即傳遞程式控制。Java提供了許多立即跳轉到程式中另一行程式碼的語句,包括break、continue、return、throw。Java語言不支援goto語句。

break

 break語句用於結束全部迴圈

  • 例:1+2+3+……n>1000時,輸出m 的值。
package com.k;
public class Dowhile {
public  static  int fun1(){
            int i = 1;
            int tmp = 0;
            for(;tmp <= 1000;i ++){
                tmp += i;
            }
            return i - 1;
        } //只用for迴圈
        public  static  int fun2(){
            int i = 1;
            int tmp = 0;
            for(;;i ++){
                tmp += i;
                if(tmp > 1000){
                    break;
                }
            }  //break 結束迴圈黨tmp大於1000時,返回i的值
            return i;
        }
         public static void  main(String[] args) {
        System.out.println(fun1());
        System.out.println(fun2());
        }
}
45
45

continue

 continue語句用於結束本次迴圈

  • 例:求既能被3整除又能被5整除的數字。
package com.k;
public class Dowhile {
ublic static void main(String[] args) {
            System.out.println("1-100之間既能被3整除又能被5整除的數:");
            for (int i = 1; i <= 100; i++) {
              if (i % 15 != 0) {
                  continue;
              }
                System.out.println(i);
          }
      }
 }
1-100之間既能被3整除又能被5整除的數:
15
30
45
60
75
90

return語句

 return語句用於終止方法的執行並將控制返回給呼叫方法。如果方法有返回型別,return語句必須返回這個型別的值。如果方法為void型別,應使用沒有表示式的return語句;如果方法為void型別,方法體最後的return語句可以省略。

陣列(Array)

 陣列是一種資料結構,包含相同型別的一組資料。陣列本身是陣列引用型別物件,陣列元素可以是任何資料型別(簡單型別或引用型別),包括陣列型別。
 陣列有一個“秩(rank)”,確定和每個陣列元素的索引個數,其值是陣列型別的方括號對([])的個數。陣列的秩又稱為陣列的維度。“秩”為1的陣列稱為一維陣列,“秩”大於1的陣列稱為多維陣列。維度大小確定的多維陣列通常稱為二維陣列、三維陣列等。
 陣列的每一個維度都有一個關聯的長度(length),它是一個大於或等於0的整數。建立陣列例項時,將確定維度和各維度的長度,它們在該陣列例項的整個生存期內保持不變。換言之,對於一個已存在的陣列例項,既不能更改它的維度,也不能調整它的維度大小。
 Java 語言中提供的陣列是用來儲存固定大小的同類型元素。

陣列的宣告:

 首先必須宣告陣列變數,才能在程式中使用陣列。因為陣列型別為引用型別,陣列變數的宣告只是為陣列例項的引用留出空間。陣列的宣告有以下兩種形式:1.型別[] 陣列變數名; //一般用該種形式; 2. 型別 陣列變數名[];

  • 例:
int[] arr1;    //宣告一個整型陣列
byte[] arrByte1;	//宣告一個byte型別陣列  

陣列的例項化(建立)和初始化:

陣列在聲明後必須例項化才能使用。陣列例項在執行時使用new運算子動態建立(即例項化)。
 new運算子指定陣列例項的長度。new運算子自動將陣列的元素初始化為相應的預設值:簡單數值型別的陣列元素預設值設定為零;char型別陣列元素被初始化為0(\u0000);boolean型別陣列元素被初始化為false;而引用型別陣列元素的預設值設定為null。使用new運算子建立陣列時,還可以通過{}初始化陣列的元素。

  • 例:
int[] arr1;		//宣告陣列
arr1 = new int[10];		//建立一個可以儲存10個整數的陣列(例項化陣列)
int[] arr2 = new int[10];		//同時宣告和建立陣列
arr2 = new int[]{1,2,3,4};		//建立並初始化一個可以儲存5個整數的陣列
int[] arr3 = {1,2,3,4,5};		//宣告並初始化一個儲存4個整數的int陣列(Java編譯器將自動出啊年陣列)
String str[][] = new String[3][4];  //多維陣列

 如果通過{ }初始化陣列的元素,則使用new運算子建立陣列不需要也不能指定陣列元素的個數,Java編譯器將自動推斷出陣列的元素個數。 宣告陣列時,可直接初始化(無需使用new運算子建立陣列),Java編譯器將自動建立陣列(例項化)。

陣列的基本訪問操作

 通過陣列下標(或索引)來訪問陣列中的資料元素。可以使用for each迴圈訪問陣列的各個元素。陣列下標從0開始,具有n個元素(即維度長度為n)的陣列下標是 0~n-1。通過陣列的length屬性,可以獲取陣列的長度。注意:訪問陣列時,如果使用了超過陣列下標範圍的索引,即陣列越界,則會引發ArrayIndexOutOfBoundsException。

  • 例:
package kkee;
import java.util.Arrays;
public class NewArray {
    public static void main(String[] args) {
        int[] myList = {9, 2, 4, 5};		//宣告並初始化陣列myList
        // 列印所有陣列元素
        for (int i = 0; i < myList.length; i++) {
            System.out.println(myList[i] + " ");
        }
        // 計算所有元素的總和
        int total = 0;
        for (int i = 0; i < myList.length; i++) {
            total += myList[i];
        }
        System.out.println("Total is " + total);
        // 查詢最大元素
        int max = myList[0];
        for (int i = 1; i < myList.length; i++) {
            if (myList[i] > max)
                max = myList[i];
        }
        System.out.println("Max is " + max);
         Arrays.sort(myList);		//Arrays.sort 陣列排序
        System.out.println(Arrays.toString(myList));
    }
}

9 
2 
4 
5 
Total is 20
Max is 9
[2, 4, 5, 9]
  • 例:用陣列列印斐波那契數列的前20項。
package com.k;
import java.util.Arrays;		//匯入Arrays包
public class Array {
    public static void fabonacci(int[] array){ //陣列作為函式的引數
        int i;
        array[0] = 1;
        array[1] = 1;
        for(i = 2;i < array.length; i++){
            array[i] = array[i - 1] + array[i - 2];
        }
    }
    public static void main(String[] args) {
        int[] array = new int[20];
      fabonacci(array);
      System.out.println(Arrays.toString(array));
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
  • 例: for each輸出陣列元素:
package kkee;
import java.util.Arrays;
/**
 - @Package: kkee
 - @Author:kkz
 - @Description:
 - @Date:Created in 2018/10/16 17:04
 */
public class Arrayforeach {
    public static void main(String[] args) {
        int[] array1 = new int[]{1,2,3,4,5};
        for(int i = 0;i < array1.length;i++) {
            System.out.print(array1[i] + " " );
        }
        System.out.println();
        for(int i : array1) {
            System.out.println(i);
        }//for each 換行輸出陣列元素
        System.out.println(Arrays.toString(array1));//返回指定陣列的字串形式
    }
}
1 2 3 4 5 
1
2
3
4
5
[1, 2, 3, 4, 5]
  • Arrays 類
    java.util.Arrays 類能方便地運算元組,它提供的所有方法都是靜態的。具有以下功能:
    (1)給陣列賦值:通過 fill 方法。
    (2)對陣列排序:通過 sort 方法,按升序。
    (3)比較陣列:通過 equals 方法比較陣列中元素值是否相等。
    (4)查詢陣列元素:通過 binarySearch 方法能對排序好的陣列進行二分查詢
    法操作。
    (5)複製陣列:通過copyOf方法複製陣列,擷取或預設值填充,結果為相同資料型別的長度為指定長度的陣列。
    (6)複製陣列的指定範圍內容:通過copyO分Range方法從起始索引(包括)到結束索引(不包括),結果為相同的資料型別的陣列。
    (7)返回指定陣列內容的字串形式:通過toString方法。

練習

  • 1.實現二分查詢演算法:有序的陣列
    pubclic static int binarySearch(int[] array,int key) {} 找到返回下標,沒有找到-1; 陣列名,鍵值
  • 二分查詢演算法:
     二分查詢又稱折半查詢,它是一種效率較高的查詢方法。
    折半查詢的演算法思想是將數列按有序化(遞增或遞減)排列,查詢過程中採用跳躍式方式查詢,即先以有序數列的中點位置為比較物件,如果要找的元素值小 於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查詢區間縮小一半。 折半查詢是一種高效的查詢方法。它可以明顯減少比較次數,提高查詢效率。但是,折半查詢的先決條件是查詢表中的資料元素必須有序。
     折半查詢法的優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。
     二分演算法步驟描述
    ① 首先確定整個查詢區間的中間位置 middle;
    ② 用待查關鍵字值與中間位置的關鍵字值進行比較;
    若相等,則查詢成功
    若大於,則在後(右)半個區域繼續進行折半查詢
    若小於,則在前(左)半個區域繼續進行折半查詢
    ③ 對確定的縮小區域再按折半公式,重複上述步驟。
    最後,得到結果:要麼查詢成功, 要麼查詢失敗。折半查詢的儲存結構採用一維陣列存放。
package mypratice;
/**
 * @Package: mypratice
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/16 17:15
 *
 */
public class OrderArray {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 17};
        int key = 15;		//查詢元素
        System.out.println("所查詢元素在陣列中的下標為:" + binarySearch(arr, key, 0, 10));
    }
    public static int binarySearch(int[] arr, int key,int start,int end) {
        start = 0;
        end = arr.length - 1;
        while (start <= end) {
            int middle = start + (end - start) / 2;
            if (arr[middle] == key) {
                return middle;
            } else if (arr[middle] < key) {
                start = middle + 1;
            } else {
                end = middle - 1;
            }
        }
        return -1;
    }
}
所查詢元素在陣列中的下標為:9

  • 2.求連續子陣列的最大和?
    {10,2,-1,9,-10,-99}最小值:不能超過0x80000000
    從頭到尾遍歷整個陣列,用一個整數記錄子陣列和的最大值,如果子陣列和大於這個值,則更新最大值,如果子陣列和為負,子陣列和清零,然後繼續往後遍歷。考慮陣列全是負數、陣列為空等邊界情況即可。
package mypratice;

/**
 * @Package: mypratice
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/16 22:45
 */
public class ConstantArray {
    public static int SumOfSubArray(int[] array) {
        if (array.length==0 || array==null) {
            return 0;
        }
        int currentSum = 0;     //儲存當前連續n項的和
        int max = 0;            //儲存連續子陣列和的最大值
        for (int i = 0; i < array.length; i++) {
         
            if(currentSum<=0){      //如過當前連續n項的和小於等於0,則沒必要與後面的元素相加
                currentSum = array[i];      //currentSum重新賦值
            }else{
                currentSum += array[i];     //如果currentSum的值大於0,則繼續與後面的元素相加,
            }
            if(currentSum>max){         //每次改變currentSum的值都有與max進行比較
                max = currentSum;       //如果currentSum的值大於max,則將currentSum的值賦值給max
            }
        }
        return max;
    }
    public static void main(String[] args) {
        int[] array = {10,2,-1,9,-10,-99};
        int result = SumOfSubArray(array);
        System.out.println("連續子陣列的最大和為:"+result);
    }
}
連續子陣列的最大和為:20
  • 3.交換兩個數?
package mypratice;

import java.util.Arrays;

/**
 * @Package: mypratice
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/16 22:24
 */
public class ChangeValue {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int temp = 0; //引入臨時變數,賦初始值為0
        temp = arr[1];  //將arr[1]的值賦給temp   temp = 1
        arr[1] = arr[4];  //將arr[4]的值賦給arr[1]   arr[1] = 5
        arr[4] = temp;  //將temp的值賦給arr[4]    arr[4] = 1
        System.out.println(Arrays.toString(arr));    //返回指定陣列的字串形式
    }
}
[1, 5, 3, 4, 2]
  • 4.逆置陣列?{1,2,3,4}===》{4,3,2,1}
package mypratice;
import java.util.Arrays;
/**
 * @Package: com.k
 * @Author:kkz
 * @Description:
 * @Date:Created in 2018/10/14 21:09
 *
 * 逆置陣列?{1,2,3,4}===》{4,3,2,1}
 * 將陣列中的
 */
public class TestArray {
    public static void main(String[] args) {
        int n = 1/2;
        int[] array = {1,2,3,4};//宣告並初始化陣列
        for(int i = 0;i < (array.length)/2; i ++){
            int tmp = array[i];//把陣列中的值賦給臨時變數
            array[i] = array[array.length - i - 1];//將後面的值賦給陣列前面
            array[array.length - i - 1] = tmp;//將臨時變數裡的值賦給後面 即交換陣列前一半與後面的元素
        }
        for(int i = 0;i < array.length; i ++) {}
            System.out.println(Arrays.toString(array));
    }
}
[4, 3, 2, 1]