一組型別相同且長度固定的資料。
因為每種資料型別在記憶體空間中佔據的大小不同,所以一個陣列不能存放不同的資料型別。
應對程式的各種需求,需要對多個同種資料進行打包處理。
宣告一個長度為5的整型陣列:
int[] a = new int[5];
a[0] = 8;
賦值和宣告也可以連寫:
int[] scores = {89,79,76};
int[] scores = new int[]{89,79,76};
a[0] = a[0]*10;
還有專門針對陣列的迴圈——增強for迴圈:
int [] nums = {1,2,3,4};
for (int x : nums) {
// 迴圈體程式碼塊
}
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),直到最後一個站在臺上的一個則是最大/最小的。
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迴圈即可以完成交換操作。
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
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決定每次比較到幾個數。
寫在前面:我們都知道,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+" ");
}
}
}
分析:我們可以建立兩個陣列,用陣列二來接收輸入的資料,並使陣列二每次迴圈都增加長度,而且將陣列二多次賦值給陣列一,從而達到陣列一貌似在自增長的樣子。