1. 程式人生 > 程式設計 >Java中陣列的定義和使用教程(三)

Java中陣列的定義和使用教程(三)

陣列排序

在很多的面試題上都會出現陣列排序的操作形式。但是這個時候你千萬別寫上:java.util.Arrays.sort(陣列)。而這種排序都是以升序為主。

基礎的排序操作:

範例: 氣泡排序

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9,3,1,5,4,2,7,8,6,0};
		sort(data);
		printArray(data);
	}

	public static void sort(int arr[]) { //實現陣列排序
		for(int x = 0; x < arr.length - 1; x++) {
			for(int y = 0; y < arr.length - x - 1; y++) {
				if(arr[y] > arr[y+1]) {
					int temp = arr[y];
					arr[y] = arr[y+1];
					arr[y+1] = temp;
				}
			}
		}
	}
	//定義一個專門進行陣列輸出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

陣列轉置

所謂的轉置最簡單的理解就是首尾交換。而如果要想實現這樣的交換有兩種實現思路。

思路一:開闢一個新的等長的陣列,而後將原始陣列倒序儲存進去;

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9,0};
		data = reverse(data); //反轉
		printArray(data);
	}
	public static int [] reverse(int arr[]) { 
		int temp[] = new int[arr.length];
		int foot = 0;
		for(int x = arr.length - 1; x >= 0; x--) {
			temp[foot++] = arr[x];
		}
		return temp;
	}
	//定義一個專門進行陣列輸出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

使用此類模式實現的最大問題在於開闢了兩塊相同的堆記憶體空間,所以造成空間浪費。

思路二:在一個數組上完成轉換

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {9,0};
		reverse(data); //反轉
		printArray(data);
	}

	public static void reverse(int arr[]) {
		int center = arr.length / 2; //轉換次數
		int head = 0; //頭部開始索引
		int tail = arr.length - 1; //尾部開始索引
		for(int x = 0; x < center; x++) {
			int temp = arr[head];
			arr[head] = arr[tail];
			arr[tail] = temp;
			head++;
			tail--;
		}
	}
	//定義一個專門進行陣列輸出的方法
	public static void printArray(int temp[]) {
		for (int i = 0; i < temp.length; i++) {
			System.out.print(temp[i] + "、");
		}
		System.out.println();
	}
}

這種轉換隻需要根據陣列長度 ÷ 2即可。

如果要進行二維陣列的原地轉置,那麼肯定有一個前提:行列要相等。

範例: 保證中間軸不變(x = y)

public class ArrayDemo {
	public static void main(String args[]) {
		int data[][] = new int[][] {{1,3},{4,6},{7,9}};
		reverse(data); //反轉
		printArray(data);
	}

	public static void reverse(int arr[][]) {
		for(int x = 0; x < arr.length; x++) {
			for(int y = x; y < arr[x].length; y++) {
				if(x != y) {
					int temp = arr[x][y];
					arr[x][y] = arr[y][x];
					arr[y][x] = temp;
				}
			}
		}
	}
	//定義一個專門進行陣列輸出的方法
	public static void printArray(int temp[][]) {
		for (int i = 0; i < temp.length; i++) {
			for(int j = 0; j < temp[i].length; j++) {
				System.out.print(temp[i][j] + "、");
			}
			System.out.println();
		}
		System.out.println();
	}
}

二分查詢法

如果現在要求在一個指定的陣列之中查詢一個數據的位置,那麼現在可能想到的最簡化的實現,整體陣列遍歷。

範例: 順序查詢

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {1,8};
		int search = 7;
		System.out.println(index(data,search));
	}
	public static int index(int arr[],int key) {
		for(int x = 0; x < arr.length; x++) {
			if(arr[x] == key)
				return x;
		}
		return -1;
	}
}

這個的時間複雜度是n,也就是說所有的陣列中的資料都需要進行一次遍歷,這樣才能確認所需要查詢的資料是否存在,那麼現在如果想進行更快速地查詢,最好的做法是進行二分查詢(折半查詢)。

範例: 實現二分查詢(採用遞迴)

public class ArrayDemo {
	public static void main(String args[]) {
		int data[] = new int[] {1,search));
	}
	public static int binarySearch(int arr[],int from,int to,int key) {
		if(from < to) {
			int mid = from / 2 + to / 2; //確定中間點
			if(arr[mid] = key) { //資料找到了
				return mid; // 取得當前索引
			}else if(key < arr[mid]) {
				return binarySearch(arr,from,mid - 1; key);
			}
			else(key > arr[mid]){
				return binarySearch(arr,mid + 1,to,key);
			}
		}
		return -1;
	}
}

但是這些都是屬於資料結構課程的範圍,是邏輯思維訓練。

物件陣列(核心)

在之前所定義的陣列都屬於基本資料型別陣列,那麼物件也可以將其定義為陣列,這樣的操作形式稱為物件陣列。物件陣列往往是以引用資料型別為主的定義,例如:類、介面,而且物件陣列也分為兩種定義格式。

  • 物件陣列動態初始化:類名稱 物件陣列名稱[] = new 類名稱[長度];
  • 物件陣列靜態初始化:類名稱 物件陣列名稱[] = new 類名稱[]{例項化物件,…};

範例: 物件陣列的動態初始化

class Person {
	private String name;
	private int age;

	public Person(String n,int a) {
		name = n;
		age = a;
	}
	public String getInfo() {
		return "姓名:" + name + ",年齡:" + age;
	}
}
public class ArrayDemo {
	// 動態初始化之後物件陣列中的每一個元素都是其物件資料型別的預設值
	public static void main(String args[]) {
		Person per[] = new Person[3]; //動態初始化
		per[0] = new Person("張三",1);
		per[1] = new Person("王五",2);
		per[2] = new Person("李四",4);
		for(int x = 0; x < per.length; x++) {
			System.out.println(per[x].getInfo());
		}
	}
}

範例: 靜態初始化

class Person {
	private String name;
	private int age;

	public Person(String n,int a) {
		name = n;
		age = a;
	}
	public String getInfo() {
		return "姓名:" + name + ",年齡:" + age;
	}
}
public class ArrayDemo {
	// 動態初始化之後物件陣列中的每一個元素都是其物件資料型別的預設值
	public static void main(String args[]) {
		Person per[] = new Person[] {
		new Person("張三",1),new Person("王五",2),new Person("李四",4)
		}; //動態初始化
		for(int x = 0; x < per.length; x++) {
			System.out.println(per[x].getInfo());
		}
	}
}

每一個物件可以儲存更多的的屬性,所以物件陣列儲存的內容要比基本資料型別更多。那麼應用的也就更多。所有的開發必定都存在有物件陣列的概念。

總結

到此這篇關於Java中陣列的定義和使用的文章就介紹到這了,更多相關Java陣列的定義和使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!