文章目錄
JAVA數組Array
數組
什麼是數組
- 相同數據類型的元素組成的集合。
- 這些元素按線性順序排列。所謂線性順序是指除第一個元素外,每一個元素都有唯一的前驅元素;除最後一個元素外,每一個元素都有唯一的後繼元素(“一個跟一個”)。
- 可以通過下標的方式訪問數組中的每一個元素。
數組的創建
- 數組類型變量按照如下等號左邊的方式聲明。
- 等號右邊創建數組對象。
數組的初始化
- 基本類型的數組(數據元素爲基本類型)創建後,其元素的初始值:byte、short、char、int、long爲0;float和double爲0.0;Boolean爲false。
- 可以在數組聲明的同時進行初始化。(這種初始化方式只能用於聲明時初始化,不能用於賦值。)
數組的賦值
- 可以通過如下方式給數組類型變量(引用)賦值。
數組的訪問
- 調用數組的length屬性可以獲取數組的長度:
int len = arr.length;
- 可以通過下標的方式訪問數組中的每一個元素。需要注意的是:數組的下標從0開始,對於長度爲n的數組,下標的範圍是0~(n-1)。
int tmp = a[2];
//swap(arr[i],arr[i+1])
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
數組複製
- JDK提供對數組進行復制的方法,即將一個數組(源數組)中的各個元素值複製到另一個數組(目標數組)中。
System.arraycopy(src, srcPos, dest, destPos, length);
// src——要複製的源數組
// srcPos——從源數組複製的起始位置
// dest——複製到的目標數組
// destPos——複製到目標數組中的起始位置
// length——要複製的元素個數
int[] arr = {1,2,3,4,5,6};
int[] arr1 = arr;
arr = new int[arr.length + 1];
System.arraycopy(arr1, 0, arr, 0, arr1.length);
arr[6] = 7;
System.out.println(Arrays.toString(arr));
- 還可以通過Arrays.copyOf方法實現數組擴展
dst = Arrays.copyOf(src, src.length + 1);
//src——源數組
//dst——擴展後數組
//src.length + 1 ——擴展後的長度
int[] arr = {1,2,3,4,5,6};
int[] arr1 = arr;
// arr = new int[arr.length + 1];
// System.arraycopy(arr1, 0, arr, 0, arr1.length);
arr = Arrays.copyOf(arr1, arr1.length + 1);
arr[6] = 7;
System.out.println(Arrays.toString(arr));
數組擴展
- 數組的長度在創建後是不可改變的。所謂擴展是指擴建一個更大的新數組並將原來數組的內容複製到其中。
int[] arr = {1,2,3,4,5,6};
int[] arr1 = arr;
arr = new int[arr.length + 1];
System.arraycopy(arr1, 0, arr, 0, arr1.length);
arr[6] = 7;
System.out.println(Arrays.toString(arr));
代碼示例
求數組的最大值並放在最後一位
- MaxOfArray.java
package day01;
import java.util.Random;
import java.util.Arrays;
public class MaxOfArray {
public static void main(String[] args) {
//創建一個10個長度的
int[] arr = new int[10];
//隨機生成10個0-99之間的數值,放入數組
Random ran = new Random();
for(int i = 0; i < arr.length; i++)
{
arr[i] = ran.nextInt(100);
}
//打印數組中的數據
System.out.println("數組中的數據爲:" + Arrays.toString(arr));
//查詢最大值
int max = arr[0];
for(int i = 1; i < arr.length; i++)
{
if(max < arr[i])
{
max = arr[i];
}
}
System.out.println("最大值是:" + max);
//創建新數組
arr = Arrays.copyOf(arr, arr.length + 1);
//最大值放入最後一個位置,並打印新數組內容
arr[arr.length - 1] = max;
System.out.println("最新數組中的數據爲:" + Arrays.toString(arr));
}
}
- 執行結果
Arrays核心API
- JDK中的java.utils.Arrays類提供對數組操作的一系列實用方法:
//toString方法用於字符串表示數組元素
//Arrays.toString
//equals方法用於比較兩個數組的各個元素是否相等
//Arrays.equals
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = {1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.equals(arr1,arr2));
- Arrays.sort方法用於實現數組的排序。
int[] arr = {40, 92, 1, 54, 22, 33,88, 18};
String[] names = {"Oscar", "Edgar", "Frank", "Laurent", "Hugo", "Jacob", "Aaron", "Gino", "Angus", "Ken"};
//按照數值大小順序排序
Arrays.sort(arr);
//按照字典順序排序
Arrays.sort(names);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(names));
- Arrays.binarySearch方法用於實現有序數組的二分法查找
int[] arr = {40, 92, 1, 54, 22, 22, 33,88, 18};
Arrays.sort(arr);
//返回下標值
int index = Arrays.binarySearch(arr, 88);
System.out.println(index);
//找不到時返回負數。
index = Arrays.binarySearch(arr, 90);
System.out.println(index);
//有多個相同值不一定返回哪個。
index = Arrays.binarySearch(arr, 22);
System.out.println(index);
練習題
“水仙花數”問題
所謂“水仙花數”就是一個整數滿足其值等於各個數位的n位次冪之和。例如:153就是一個水仙花數。
153 = 1^3 + 5^3 + 3^3
- 問題:計算1000以內的所有水仙花數。用戶輸入0到1000以內的某個數,系統輸出這個範圍內的所有
水仙花數,水仙花數是指一個 n 位數 ( n≥3 ),它的每個位上的數字的 n 次冪之和等於它本身。(例
如:1^3 + 5^3 + 3^3 = 153)。 - Daffodils.java
package day01;
import java.util.Scanner;
public class Daffodils {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入查找水仙花的範圍:0~");
int max = scanner.nextInt();
scanner.close();
for(int n = 3; n <= max; n++)
{
int sum = 0;
for(int m = n; m > 0; m /= 10)
{
int v = m % 10;
sum += v * v *v;
}
if(n == sum)
{
System.out.print(n + " ");
}
}
System.out.println("查找完畢");
}
}
- 執行結果:
百錢買百雞
計算“百錢買百雞”的問題。
百錢買百雞:公雞5文錢一隻,母雞3文錢一隻,小雞1文錢3只,如何用百文錢買百隻雞?
- DaffodilsExt.java
package day01;
public class DaffodilsExt {
public static void main(String[] args) {
int cock, hen, chick;
System.out.println("百錢買百雞的方案如下:");
for(cock = 0; cock <= 20; cock++)
{
for(hen = 0; hen <= 33; hen++)
{
chick = 100 - cock - hen;
if(chick % 3 == 0)
{
int total = cock * 5 + hen * 3 + chick /3;
if(total == 100)
{
System.out.println("公雞:" + cock + ",母雞:" + hen
+ ",小雞:" + chick);
}
}
}
}
}
}
- 執行結果
冒泡排序法
冒泡排序法(Bubble sort)是一種比較簡單的排序算法。在冒泡排序算法中,需要重複的走訪要排序的數列,一次比較兩個元素,如果它們的大小順序錯誤就把它們交換過來。走訪數列的工作是重複進行指導沒用需要交換的元素,也就是說數列已經排序完成。由於排序過程重總是小數往前放,大數往後放,類似氣泡上升,所以稱爲冒泡排序。
- BubbleSort.java
import java.util.Random;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[10];
Random ran = new Random();
for(int i = 0; i< arr.length; i++)
{
arr[i] = ran.nextInt(100);
}
System.out.println(Arrays.toString(arr));
System.out.println("----------冒泡排序開始--------");
for(int i = 0; i < arr.length -1 ; i++)
{
for(int j = 0; j < arr.length - i - 1; j++)
{
if(arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
System.out.println("---------冒泡排序結束--------");
System.out.println(Arrays.toString(arr));
}
}
- 執行結果