小湯學程式設計之JAVA基礎day05——陣列

2020-10-18 13:00:31

在這裡插入圖片描述

一、概念

1.什麼是陣列

一組型別相同且長度固定的資料。

因為每種資料型別在記憶體空間中佔據的大小不同,所以一個陣列不能存放不同的資料型別。

2.為什麼要用到陣列

應對程式的各種需求,需要對多個同種資料進行打包處理。

二、使用方法

1.宣告並分配空間

宣告一個長度為5的整型陣列:

int[] a = new int[5];

2.賦值

a[0] = 8;

賦值和宣告也可以連寫:

int[] scores = {89,79,76};
int[] scores = new int[]{89,79,76};

3.處理資料

a[0] = a[0]*10;

還有專門針對陣列的迴圈——增強for迴圈:

int [] nums = {1,2,3,4};
for (int x : nums) {
	// 迴圈體程式碼塊
}

三、陣列的各種應用

1.求陣列中最大/最小值

public class Test1 {
    public static void main(String[] args) {
        // 求陣列{5,9,8,7,2,4}裡的最大值和最小值
        int[] arr = {5, 9, 8, 7, 2, 4};
        int max = arr[0];
        int min = arr[0];
        for (int i : arr) {
            if (i > max) {
                max = i;
            }
            if (i < min) {
                min = i;
            }
        }
        System.out.println("最大值為:" + max);
        System.out.println("最小值為:" + min);
    }
}

上述程式碼的執行結果:
最大值為:9
最小值為:2

分析:想象一場擂臺賽,擂臺的名字叫max/min。先預設,第一位選手(arr[0])是最強的,然後選手(數值)們依次(通過foreach迴圈)上臺與當前最強的pk(判斷大小)。如果獲勝就佔領擂臺(max = i),直到最後一個站在臺上的一個則是最大/最小的。

2.陣列反轉和插值

(1)數值反轉
public class Test2 {
    public static void main(String[] args) {
        // 數值反轉:將陣列{{5,9,8,7,2,4}}的順序反過來
        int[] arr = {5, 9, 8, 7, 2, 4};
        int mid;
        for (int i = 1; i <= arr.length/2 ; i++) {
            mid = arr[i-1];
            arr[i-1] = arr[arr.length-i];
            arr[arr.length-i] = mid;
        }
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
}

上述程式碼的執行結果:4 2 7 8 9 5

分析:首先考慮,要將該陣列倒過來,需要交換幾次元素。此陣列元素有6個,個數是偶數,需要調換6/2=3次。如果只有5個元素,只需調換(5-1)/2=2次,但我們可以利用java的int型別做除法時丟失精度的原理,直接用5/2=2次。所以無論陣列的元素個數是單數還是雙數,我們都可以用arr.length/2來得到要交換的次數。之後通過for迴圈即可以完成交換操作。

(2)插值
package Homework;

import java.util.Scanner;

public class Task9 {
    /*9.定義一個有序數列,{1,5,20,30,80},
    要求使用者輸入一個數位,然後插到陣列中,並保持升序,不能使用氣泡排序。*/
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = {1, 5, 20, 30, 80};
        int num = 0;
        System.out.print("請輸入一個數位:");
        int awr = sc.nextInt();
        // 得到插入位置下標
        for (int i = 0; i < arr.length; i++) {
            if (awr > arr[i]) {
                num++;
            } else {
                break;
            }
        }
        int[] arrNew = new int[arr.length + 1];
        // 插入下標之前的和原陣列一一對應
        for (int i = 0; i < arrNew.length; i++) {
            if (i != num) {
                arrNew[i] = arr[i];
            } else {
                break;
            }
        }
        // 插入下標之後的和原陣列錯一位對應
        for (int i = num; i < arrNew.length; i++) {
            if (i == num) {
                arrNew[num] = awr;
            } else {
                arrNew[i] = arr[i - 1];
            }
        }
        // 輸出陣列
        for (int i : arrNew) {
            System.out.print(i+" ");
        }
    }
}

上述程式碼的執行結果:
請輸入一個數位:25
1 5 20 25 30 80

3.氣泡排序

public class Test3 {
    public static void main(String[] args) {
        // 氣泡排序:將陣列{{5,9,8,7,2,4}}從小到大進行排序
        int[] arr = {5, 9, 8, 7, 2, 4};
        int mid;
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j]>arr[j+1]){
                    mid = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = mid;
                }
            }
        }
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
}

分析:氣泡排序的原理是從左到右讓相鄰的兩個數進行比較,將較大者換到右邊。外層的for決定來幾次從左到右的比較,裡層的for決定每次比較到幾個數。

4.自由長度的陣列

寫在前面:我們都知道,java的陣列在定義時長度就已經固定了,但是我們仍然可以通過一些方法讓其達到類似自由長度的效果。
下面來看一個例子:

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        // 輸入任意數量的數,並將其放入一個陣列
        int[] arr = new int[0];
        int[] arrNew;
        Scanner sc = new Scanner(System.in);
        int flag = 1;
        
        // 通過迴圈來使arr陣列逐漸變長
        for (int i = 0;; i++) {
            arrNew = new int[arr.length+1];
            System.out.print("請輸入第"+(i+1)+"個數:");
            arrNew[i] = sc.nextInt();
            for (int j = 0; j <arr.length ; j++) {
                arrNew[j]= arr[j];
            }
            arr = arrNew;
            System.out.print("是否繼續輸入:(1:繼續; 0:停止)");
            flag = sc.nextInt();
            if (flag!=1) {
                System.out.println("好的,停止輸入。");
                break;
            }
        }
        for (int i:arr) {
            System.out.print(i+" ");
        }
    }
}

分析:我們可以建立兩個陣列,用陣列二來接收輸入的資料,並使陣列二每次迴圈都增加長度,而且將陣列二多次賦值給陣列一,從而達到陣列一貌似在自增長的樣子。