1. 程式人生 > >JAVA語言基礎——(三)跳轉語句、陣列

JAVA語言基礎——(三)跳轉語句、陣列

Java程式語句執行的順序包括4種基本控制結構:
(1)順序結構;
(2)選擇結構:if語句和switch語句;
(3)迴圈結構:for、while、do……while、for each;
(4)異常處理邏輯結構。

一、跳轉語句

跳轉語句用於無條件地轉移控制。使用跳轉語句執行分支,該語句會導致立即傳遞程式控制。
(一)break語句
(1)不帶標籤的break語句:
在多分支選擇(switch結構)中的作用是跳出switch結構,繼續執行switch語句的後繼語句。
還可以用於退出for、for each、while或do……while迴圈,即提前結束迴圈,接著執行迴圈語句的後繼語句。

注:不能用於迴圈語句和switch語句之外的任何其他語句之中,否則將產生編譯錯誤。
當多個switch、while、do……while、for或for each語句彼此巢狀時,不帶標籤的break語句只應用於最裡層的語句,即用於跳出最近的一層迴圈。

若要穿過多個巢狀層轉移控制,必須使用帶標籤的break語句。
(2)帶標籤的break語句:
帶標籤的break語句用於跳出有標籤標記的語句/語句塊。
標籤是一個識別符號,標籤後面帶一個冒號,並置於一個語句或語句塊之前,則標記該語句或語句塊。
注:帶標籤的break語句跳轉到目的標籤只能指向包含該break語句的外層語句塊,否則會產生編譯錯誤。
(二)continue語句
(1)不帶標籤的continue語句:
類似於break語句,但它結束本次迴圈,即跳過迴圈體內continue下面尚未執行的語句,返回到迴圈起始處,並根據迴圈條件判斷是否執行下一次迴圈。
與不帶標籤的break語句的區別在於:continue語句只結束本次迴圈,並返回到迴圈起始處,如果條件滿足就開始執行下一次迴圈;而break語句則是結束迴圈,跳轉到迴圈的後繼語句執行。

與不帶標籤的break語句相似,當多個while、do……while、for或for each語句彼此巢狀時,不帶標籤的continue語句只應用於最裡層的語句。如果要穿過多個巢狀層轉移控制,必須使用帶標籤的continue語句。
(2)帶標籤的continue語句:
與帶標籤的break語句相似,用於結束本次迴圈,並跳轉到由標籤標記的外層迴圈。

注:帶標籤的continue語句只能用於穿過多個巢狀層轉移控制,它跳轉到的目標標籤也只能指向包含該continue語句的外層語句塊,否則會產生編譯錯誤。
(三)return語句
用於終止方法的執行並將控制返回給呼叫方法。
如果方法有返回型別,return語句必須返回這個型別的值。
如果方法為void型別,不使用return語句。

二、陣列概述

陣列是一種資料結構,是包含相同資料型別的集合。本身是陣列引用型別物件,陣列元素可以是任何資料型別(簡單型別或引用型別),包括陣列型別。

  • 陣列必須先宣告。因為陣列型別為引用型別,陣列變數的宣告只是為陣列例項的引用留出空間。
  • 陣列在聲明後必須例項化才能使用。

注:如果通過{}初始化陣列的元素,使用new運算子建立陣列不需要也不能指定陣列元素的個數,Java編譯器將自動推斷陣列的個數。

通過陣列下標來訪問陣列中的資料元素。陣列下標從0開始,具有n個元素(即長度為n)的陣列的下標是0~n-1.

三、Java類庫中運算元組的類和方法

(1)java.util.Arrays:可用於陣列的複製、排序等操作處理。
(2)System.arraycopy:是System類提供的一個靜態方法,可以用它來實現陣列間的複製。
(3)陣列名.clone():
如果要將一個數組a1的內容複製給另外一個數組a2的方法:

  • 使用迴圈語句,將陣列a1的每個元素複製到陣列a2對應的元素。優點:靈活;缺點:需要編碼。
  • 使用陣列變數的clone()方法。優點:簡單;缺點:不夠靈活。
  • 使用System.arraycopy(src,srcPos,dest,destPos,length)方法。該方法靈活簡單推薦使用。
  • 使用java.util.Arrays.CopyOf/copyOfRang方法。簡單靈活推薦使用。

注:clone()方法不能直接作用於多維陣列。如果要用clone()方法對多維陣列進行復制,就要在每一維上呼叫clone()方法。

練習

**1.1.實現二分查詢演算法:有序的陣列
**

//import java.util.Scanner;

public class BinarySearch {
    //二分查詢
    public static int binarySearch(int[] a,int key){
        //開始查詢範圍始從陣列的第一個元素到最後一個
        int low = 0;//最小元素下標為0
        int high = a.length - 1;//最大元素下標==陣列長度-1
        int m = a.length / 2;//中間數下標
        if (key == a[m]){//中間數和key相等,查詢成功
            return m;
        }else{
            //如果不相等,繼續查詢
            while(low <= high){//查詢結束,退出迴圈
                m = (low + high) /2;
                if (key == a[m]){//如果key和比較元素的值相等,查詢成功
//                System.out.println(key + "= array[" + m + "]" );
                    return m;
                }else if(key < a[m]){
                    high = m - 1;//在中間數的左邊查詢
                } else{//key>a[m]
                    low = m +1;//在中間數右邊查詢
                }
            }
            //查詢失敗,返回-1
            return -1;
        }

    }

    public static void main(String[] args){

//        Scanner scan = new Scanner(System.in);
//        System.out.println("輸入一個長度為10的一維陣列:");
//        int[] array = new int[10];
//        for(int i = 0;i < 10;i ++){
//            array[i] = scan.nextInt();
//        }

        int[] array = {1,2,3,4,5,6,7,8,9,10};
        binarySearch(array,3);

//        System.out.println("查詢元素:");
//        int k = scan.nextInt();
////        System.out.println(k);
//        binarySearch(array,k);
    }
}

**2.求連續子陣列的最大和
**

//求連續子陣列的最大和,不能超過0x8000 0000
//import java.util.Scanner;
import java.util.Arrays;

public class MaxSumOfSubarray {
    public static int maxSum(int a[]) {
        if (a.length == 0) //陣列長度為0,直接返回-1
            return -1;
        if (a.length == 1)
            return a[0];
        int sum = a[0];
        int max;
        for (int i = 0; i < a.length - 1; i++) {
            max = a[i];//從a[i]往後遍歷,相加之後和sum比較
            for (int j = i + 1; j < a.length; j++) {
                sum = sum + a[j];
                if (sum > max) {
                    max = sum;
                }
            }
        }
        return max;//返回錯誤??
    }

    public static void main(String[] args) {
        int array[] = {-1, 5, 10, -2, 9};
        System.out.println("子陣列最大和:");
        maxSum(array);
        System.out.println(Arrays.toString(array));
    }
}

**3.交換兩個數
**
//交換兩個數

import java.util.Arrays;
import java.util.Scanner;

public class ExchangeNumber {
public static void exchange(int a[]){
int t;
t = a[0];
a[0] = a[1];
a[1] = t;
System.out.println(Arrays.toString(a));
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println(“輸入兩個數字:”);
int[] array = new int[2];
array[0] = scan.nextInt();
array[1] = scan.nextInt();
exchange(array);
}
}
4.逆置陣列

//逆置陣列
import java.util.Scanner;
import java.util.Arrays;

public class InverseArray {
    //逆置
    public static void inverse(int a[]){
        int t;//設中間變數t,方便陣列元素間的轉換
        for(int i = 0;i <= a.length / 2;i ++){//迴圈5次
            t = a[i];
            a[i] = a[a.length - 1 - i];//對應元素的下標和是陣列長度減一
            a[a.length - 1 - i] = t;
        }
        System.out.println(Arrays.toString(a));//輸出逆置後的陣列
    }
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        System.out.println("輸入一個長度為10的一維陣列:");
        int[] array = new int[10];
        for(int i = 0;i < 10;i ++){
            array[i] = scan.nextInt();
        }

//        int array[] = {0,1,2,3,4,5,6,7,8,9};
        inverse(array);
    }
}