1. 程式人生 > 實用技巧 >#網路流,分層圖#洛谷 4400 [JSOI2008] Blue Mary的旅行

#網路流,分層圖#洛谷 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站:

狂神說Java