#網路流,分層圖#洛谷 4400 [JSOI2008] Blue Mary的旅行
一,陣列概述
1,陣列的定義:
1).陣列是相同型別資料的有序集合
2).陣列描述的時相同型別的若干個資料,按照一定的先後次序排列組合而成
3).其中,每一個數據稱作為一個數組元素,每個陣列元素可以通過一個下標來訪問它們。
二,陣列宣告建立
1.首先必須宣告陣列變數,才能在程式中使用陣列。語法如下:
1).dataType[] arrayRefVar; //首選的方法
2).dataType arrayRefVar[]; //效果相同,但不是首選的方法
2.Java語言使用new操作符來建立陣列,語法如下:
1).dataType[] arrayRefVar = new dataType[arraySize];
3.陣列的元素時通過索引訪問的,陣列索引從0開始。
4.獲取陣列長度:
1).arrays.length
5.參考程式碼如下:
package com.liufucheng.array;
import java.sql.SQLOutput;
public class ArrayDemo01 {
public static void main(String[] args){
//宣告一個整形陣列
int[] nums; //方法一,首選
int nums2[]; //方法二,知道就行
//建立一個數組
nums = new int[10];
//宣告和建立可整合在一起,如下:
//int[] nums = new int[10];
//通過下標給陣列賦值
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;
System.out.println(nums[0]);
//通過length獲取陣列長度
System.out.println(nums.length);
//通過迴圈得到陣列所有元素和
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
System.out.println("陣列總數和:"+sum);
}
}
二.一,三種初始化和記憶體分析:
1,java記憶體分析圖:
1).如上圖所知,初學者應該要知道在java記憶體中分別有堆,棧和方法區
1>.棧:使用者在宣告陣列時,陣列名就會在棧中分配到某個地址
2>.堆:使用者在建立陣列時,就會在堆中分配到對應陣列大小的記憶體空間
2.三種初始化
1).靜態初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)};
2).動態初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
3).陣列的預設初始化:
1>.陣列是引用型別,它的元素相當於類的例項變數,因此陣列一經分配空間,其中的每個元素也被按照例項變數同樣的方式被隱式初始化。
4).參考程式碼如下:
package com.liufucheng.array;
public class ArrayDemo02 {
public static void main(String[] args){
//陣列靜態初始化
int[] nums = {1,3,5,7,9};
System.out.println(nums[3]);
//陣列動態初始化
int[] nums1 = new int[10];
nums1[0] = 2;
nums1[1] = 4;
nums1[2] = 6;
nums1[3] = 8;
nums1[4] = 10;
System.out.println(nums1[3]);
}
}
二.二 陣列的四個基本特點
1.其長度是確定的。陣列一旦被建立,它的大小就是不可以改變的
2.其元素必須是相同型別,不允許出現混合型別
3.陣列中的元素可以是任何資料型別,包括基本型別和引用型別
4.陣列變數屬引用型別,陣列也可以看成是物件,陣列中的每個元素相當於該物件的成員變數。陣列本身就是物件,java中物件是在堆中,因此陣列無論儲存原始型別還是其他物件型別,陣列物件本身是在堆中的
二.三,陣列邊界
1.下標的合法區間:[0,length-1],如果越界就會報錯;
2,ArrayIndexOutOfBoundsException:陣列下標越界異常!
3,小結:
1>.陣列是相同資料型別(資料型別可以為任意型別)的有序集合
2>.陣列也是物件。陣列元素相當於物件的成員變數
3>.陣列長度是確定的,不可變的。如果越界,則報:ArrayIndexOutofBounds
三,陣列使用
1,For-Each迴圈
參考程式碼如下:
package com.liufucheng.array;
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arrays = {1,3,5,7,9};
//是由for-Each迴圈遍歷陣列
for (int array : arrays) {
System.out.println(array);
}
String[] str = {"ren","wo","xiao"};
for (String s : str) {
System.out.print(s);
}
}
}
2,陣列作方法入參
參程式碼如下:
package com.liufucheng.array;
public class ArrayDemo05 {
public static void main(String[] args){
//陣列作引數
int[] arrays = {1,3,5,7,9,11};
//呼叫以陣列作為引數的printArrays()方法
printArrays(arrays);
}
//列印陣列元素
public static void printArrays(int[] arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.print(arrays[i]+" ");
}
}
}
3,陣列作返回值
參考程式碼如下:
package com.liufucheng.array;
//將陣列作為返回值
//將陣列arrays反轉輸出
public class ArrayDemo06 {
public static void main(String[] args){
int[] arrays = {1,3,5,7,9,11};
//呼叫反轉陣列元素方法
int[] result = reserve(arrays);
//列印反轉陣列後元素
//printArrays(result);
for (int i : result) {
System.out.print(i+" ");
}
}
//反轉陣列元素方法
public static int[] reserve(int[] arrays){
int[] result = new int[arrays.length];
for (int i = arrays.length-1,j = 0; i >= 0; i--,j++) {
result[j] = arrays[i];
}
return result;
}
//列印陣列元素
public static void printArrays(int[] result){
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+" ");
}
}
}
四,多維陣列
1,多維陣列可以看成是陣列的陣列,比如二維陣列就是一個特殊的一維陣列,其每一個元素都是一個一維陣列
2,二維陣列示例:
int a[] [] = new int[3] [5];
解析:以上二維陣列a可以看成一個三行五列的陣列。
參考程式碼如下:
package com.liufucheng.array;
//二位陣列
public class ArrayDemo07 {
public static void main(String[] args){
int[][] arrays = {{1,2},{3,4},{5,6},{7,9},{9,10}};
//列印二維陣列的元素
printArrays(arrays);
}
//列印二維陣列
public static void printArrays(int[][] arrays){
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.out.print(arrays[i][j]+" ");
}
}
}
}
五,Arrays類
1,陣列的工具類java.util.Arrays
2,由於陣列物件本身並沒有什麼方法可以供我們呼叫,但API中提供了一個工具類Arrays供我們使用,從而可以對資料物件進行一些基本的操作
3,檢視JDK幫助文件
4,Arrays類中的方法都是static 修飾的靜態方法,在使用的時候可以直接使用類名進行呼叫,而“不用”使用物件來呼叫(注意:是“不用”而不是“不能”)
5,具有以下常用功能:
1),給陣列中的某個元素重新賦值:通過fill方法。
2),對陣列排序:通過sort方法,按升序
3),比較陣列:通過equals方法比較陣列中元素值是否相等
4),查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分查詢法操作
注意:以上Arrays類方法都必須先包含java.util.Arrays包進來才可使用
參考程式碼如下:
package com.liufucheng.array;
import java.lang.reflect.Array;
import java.util.Arrays;
//使用Array類的方法
public class ArrayDemo08 {
public static void main(String[] args){
int[] array = {1,3,6,3,43,5364,342,46,999,34242114,11};
int[] array1 = {1,3,6,3,43,5364,342,46,999,34242114};
//使用toString()列印陣列元素
System.out.println(Arrays.toString(array));
//使用Arrays.equals()方法比較陣列中元素是否相等
System.out.println(Arrays.equals(array,array1));
//使用Arrays.sort()方法將陣列元素按升序排序
Arrays.sort(array);
System.out.println(Arrays.toString(array));
//使用Arrays.binarySearch()查詢元素在陣列中所在位置
System.out.println(Arrays.binarySearch(array,11));
//使用fill將陣列元素重新填充新的值
Arrays.fill(array,0);
System.out.println(Arrays.toString(array));
}
}
五.一,氣泡排序
1,氣泡排序無疑是最為出名的排序演算法之一,總共有八大排序。
2,冒泡的程式碼還是相當簡單的,兩層迴圈,外層冒泡輪數,裡層依次比較,江湖中人人盡皆知。
1),比較陣列中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換它們的位置
2),每一次比較都會得到一個最大或最小的值
3),下一輪則可以少一次排序
4),依次迴圈,直到結束
參考程式碼如下:
package com.liufucheng.array;
import java.util.Arrays;
//氣泡排序
public class ArrayDemo09 {
public static void main(String[] args){
int[] array = {30,2,100,5,2,7,73,90908,99,1392};
int[] sort = sort(array);
System.out.println(Arrays.toString(sort));
}
//氣泡排序
public static int[] sort(int[] array){
int temp = 0; //第三變數
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
}
六,稀疏陣列
1,當一個數組中大部分元素為0,或者為同一值的資料時,可以使用稀疏陣列來儲存該陣列。
2,稀疏陣列的處理方式是:
1),記錄陣列一共有幾行幾列,有多少個不同值
2),把具有不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模
注:以上內容總結來源於b站: