Java - 7 陣列
陣列
存放多個 同一型別的資料,引用資料型別,本質是物件
double[] ds = {3, 5, 2.3};
for(int i = 0; i < 3; i++){
System.out.println("第" + (i+1) + "個元素的值=" + ds[i]);
}
陣列的使用
動態初始化
double[] scores = new double[5]; // 可以存放5個double,沒有賦值時都是0(布林型別就是false)
String[] strs = new String[]{"a","b"};
// 先宣告,沒有分配記憶體空間
int[] a;
// 分配記憶體空間
a = new int[5];
靜態初始化
double[] ds = {3, 5, 2.3};
陣列長度
char[] chars = new char[26];
chars.length // 26
陣列賦值機制
基本資料型別賦值,值傳遞,賦值方式為複製
陣列在預設情況下是引用傳遞,傳遞的是地址
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2的變化會影響arr1
陣列複製
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[arr1.length];
for(int i = 0; i<arr1.length; i++){
arr2[i] = arr1[i];
}
陣列反轉
找規律反轉
public class Reverse {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66,77};
for(int i = 0; i<arr.length/2; i++){
// 一頭一尾交換
int temp = arr[arr.length-1-i];
arr[arr.length-1-i] = arr[i];
arr[i] = temp;
}
// 輸出
for(int i = 0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
逆序賦值
public class Reverse {
public static void main(String[] args) {
int[] arr1 = {11,22,33,44,55,66,77};
int[] arr2 = new int[arr1.length];
int count = 0;
// 逆序複製元素到新陣列
for(int i = arr1.length-1; i>=0; i--){
arr2[count] = arr1[i];
count++;
}
arr1 = arr2; // *
// 輸出
for(int i = 0; i<arr1.length; i++){
System.out.println(arr1[i]);
}
}
}
陣列擴容
public class Add {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66,77};
int[] arrNew = new int[arr.length+1]; // 擴容
// 複製
for(int i = 0; i<arr.length; i++){
arrNew[i] = arr[i];
}
arrNew[arrNew.length-1] = 4; //新元素
arr = arrNew; // *
// 輸出
for(int i = 0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
使用者判斷要不要加
import java.util.Scanner;
public class AddUser {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66,77};
while(true){
for(int i = 0; i<arr.length; i++){
System.out.println(arr[i]);
}
System.out.println("Want add?");
Scanner scanner = new Scanner(System.in);
char c = scanner.next().charAt(0);
if(c == 'Y'){
int[] arrNew = new int[arr.length+1];
for(int i = 0; i<arr.length; i++){
arrNew[i] = arr[i];
}
int eleNew = scanner.nextInt();
arrNew[arrNew.length-1] = eleNew;
arr = arrNew;
}else break;
}
}
}
練習
在升序陣列中插入一個數使陣列還是升序
import java.util.Scanner;
public class Insert{
public static void main(String[] args) {
int[] arr = {10,12,45,90};
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("text a number");
int num = scanner.nextInt();;
int[] arrNew = new int[arr.length+1]; // 擴容
boolean flag = false; // num是否插入陣列
for(int i = 0, j = 0; i<arrNew.length; i++){
if(flag){ // num插入了陣列後面就直接複製
arrNew[i] = arr[j];
j++;
}else if(i<arr.length){ // num不是最大
if(num > arr[j]) {
arrNew[i] = arr[j];
j++;
}
else { // 插入num
arrNew[i] = num;
flag = true;
}
}else arrNew[i] = num; // num是最大
}
arr = arrNew; // *
System.out.println("-------");
// 輸出
for(int i = 0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
}
public class Insert{
public static void main(String[] args) {
int[] arr = {10,12,45,90};
int insertNum = 22;
int index = -1; // 下標
// 確定插入下標
for(int i = 0; i<arr.length; i++){
if(insertNum<=arr[i]){
index = i;
break;
}
}
if(index == -1) index = arr.length; // insertNum最大
int[] arrNew = new int[arr.length+1]; //擴容
for(int i = 0, j = 0; i<arrNew.length; i++){
if(i != index){
arrNew[i] = arr[j];
j++;
}else arrNew[i] = insertNum;
}
arr = arrNew;
// 輸出
for(int i = 0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}
練習心得
-
兩個不同長陣列迴圈要考慮,不長過一個陣列的長度是否也不超過另一個陣列的長度
-
寫邏輯運算時想想不成立和成立分別有哪些情況