多层数组如何遍历_带你从零学大数据系列之Java篇---第五章:数组
溫馨提示:如果想學(xué)扎實,一定要從頭開始看凱哥的一系列文章(凱哥帶你從零學(xué)大數(shù)據(jù)系列),千萬不要從中間的某個部分開始看,知識前后是有很大關(guān)聯(lián),否則學(xué)習(xí)效果會打折扣.
系列文章第一篇是擁抱大數(shù)據(jù):凱哥帶你從零學(xué)大數(shù)據(jù)系列-學(xué)習(xí)大數(shù)據(jù)前奏(必讀)(點(diǎn)我)!
上一篇:擁抱大數(shù)據(jù):凱哥帶你從零學(xué)大數(shù)據(jù)系列之Java篇---第四章:方法
課程重點(diǎn):
- 數(shù)組的聲明與實例化
- 數(shù)組的引用
- 數(shù)組的元素訪問
- 數(shù)組的排序
- 數(shù)組的查詢
- Arrays工具類
5.1. 數(shù)組的概念
5.1.1. 一個案例
- 如何存儲100名學(xué)生的成績
- 辦法:使用變量存儲,重復(fù)聲明100個double類型的變量即可。
- 缺點(diǎn):麻煩,重復(fù)操作過多。
- 如何讓100名學(xué)生成績?nèi)?#43;1
- 辦法:100個變量重復(fù)相同操作,直到全部完畢。
- 缺點(diǎn):無法進(jìn)行統(tǒng)一的操作。
5.1.2. 數(shù)組是什么
數(shù)組, 是一個數(shù)據(jù)容器。 可以存儲若干個相兼容的數(shù)據(jù)類型的數(shù)據(jù)。
在上述案例中, 存儲100名學(xué)生的成績, 可以用數(shù)組來完成。 將這100個成績存入一個數(shù)組中。 此時對這些數(shù)據(jù)進(jìn)行統(tǒng)一操作的時候, 直接遍歷數(shù)組即可完成。
5.1.3. 數(shù)組的特點(diǎn)
- 數(shù)組中可以存儲基本數(shù)據(jù)類型的數(shù)據(jù), 也可以存儲引用數(shù)據(jù)類型的數(shù)據(jù)。
- 數(shù)組的長度是不可變的。 一個數(shù)組一旦實例化完成, 長度不能改變。
5.2. 數(shù)組的聲明
5.2.1. 聲明數(shù)組
/*** @Description 數(shù)組的聲明*/public class Test{ public static void main (String[] args) { // 聲明一個數(shù)組, 存儲若干個double類型的數(shù)據(jù) double[] array1; // 聲明一個數(shù)組, 存儲若干個int類型的數(shù)據(jù) int[] array2; // 聲明一個數(shù)組, 存儲若干個String類型的數(shù)據(jù) String[] array3; }}5.2.2. 數(shù)組的實例化
實例化數(shù)組: 其實就是在內(nèi)存中開辟空間, 用來存儲數(shù)據(jù)。
/*** @Description 數(shù)組的聲明*/public class Test { public static void main (String[] args) { // 實例化了一個數(shù)組, 可以存儲5個數(shù)據(jù) // 此時數(shù)組中的元素就是默認(rèn)的5個0 int[] array1=new int[5]; // 實例化了一個數(shù)組, 默認(rèn)存儲的是 1, 2, 3, 4, 5 // 此時數(shù)組的長度, 由這些存儲的數(shù)據(jù)的數(shù)量可以推算出來為5 int[] array2=new int[] { 1, 2, 3, 4, 5}; // 實例化了一個數(shù)組, 默認(rèn)存儲的是 1, 2, 3, 4, 5 // 相比較于第二種寫法, 省略掉了 new int[] int[] array3={ 1, 2, 3, 4, 5}; }}5.2.3. 數(shù)組引用
數(shù)組的實例化的時候, 需要使用到關(guān)鍵字new
以后但凡是遇到了new, 都表示在堆上開辟空間!
數(shù)組, 其實是在堆上開辟的連續(xù)的空間。 例如 new int[5] , 就是在堆上開辟5個連續(xù)的4字節(jié)空間。
然后, 將堆上的內(nèi)存地址, 給棧上的引用進(jìn)行賦值。
5.3. 數(shù)組的下標(biāo)
5.3.1. 下標(biāo)的概念
下標(biāo), 就是數(shù)組中的元素在數(shù)組中存儲的位置索引。
注意: 數(shù)組的下標(biāo)是從0開始的, 即數(shù)組中的元素下標(biāo)范圍是 [0, 數(shù)組.length - 1)
5.3.2. 訪問數(shù)組元素
訪問數(shù)組中的元素, 需要使用下標(biāo)訪問。
/*** @Description 數(shù)組的元素訪問*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array={ 1, 2, 3, 4, 5}; // 訪問數(shù)組中的元素 array[2] = 300; // 將數(shù)組中的第2個元素修改成300, 此時數(shù)組中的元素是 [ 1, 2, 300, 4, 5 ] System.out.println (array[2]);// 獲取數(shù)組中的第2個元素, 此時的輸出結(jié)果是 300 }}5.3.3. 注意事項
在訪問數(shù)組中的元素的時候, 注意下標(biāo)的問題!
如果使用錯誤的下標(biāo)訪問數(shù)組中的元素, 將會出現(xiàn) ArrayIndexOutOfBoundsException 異常!
/*** @Description 數(shù)組的元素訪問*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array = { 1, 2, 3, 4, 5}; // 訪問數(shù)組中的元素 array[10] = 300;// 使用下標(biāo)10訪問數(shù)組中的元素, 此時數(shù)組的最大下標(biāo)為4, 就會出現(xiàn) ArrayIndexOutOfBoundsException 異常 }}5.4. 數(shù)組的遍歷
數(shù)組遍歷: 其實就是按照數(shù)組中元素存儲的順序, 依次獲取到數(shù)組中的每一個元素。
5.4.1. 下標(biāo)遍歷
思路: 循環(huán)依次獲取數(shù)組中的每一個下標(biāo), 再使用下標(biāo)訪問數(shù)組中的元素
/*** @Description 下標(biāo)遍歷*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array={ 1, 2, 3, 4, 5}; // 使用下標(biāo)遍歷數(shù)組 for(int i=0; i5.4.2. 增強(qiáng)for循環(huán)
思路: 依次使用數(shù)組中的每一個元素, 給迭代變量進(jìn)行賦值。
/*** @Description 下標(biāo)遍歷*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array={ 1, 2, 3, 4, 5}; // 依次使用數(shù)組中的每一個元素, 給迭代變量進(jìn)行賦值。 // 此時, 數(shù)組中的每一個元素依次給 element 進(jìn)行賦值。 for(int element: array) { System.out.println (element); } }}5.4.3. 兩種方式的對比
- 如果需要在遍歷的同時, 獲取到數(shù)組中的元素下標(biāo), 需要使用下標(biāo)遍歷法。
- 如果需要在遍歷的同時, 修改數(shù)組中的元素, 需要使用下標(biāo)遍歷法。
- 如果僅僅是想要獲取數(shù)組中的每一個元素, 不需要下標(biāo), 也不需要修改數(shù)組中的元素, 使用增強(qiáng)for循環(huán)。 因為這種方式, 遍歷的效率比下標(biāo)遍歷法高。
5.5. 數(shù)組的排序
排序,即排列順序,將數(shù)組中的元素按照一定的大小關(guān)系進(jìn)行重新排列。
在Java中, 常見的排序有:
- 選擇排序:固定值與其他值依次比較大小,互換位置。
- 冒泡排序:相鄰的兩個數(shù)值比較大小,互換位置。JDK排序:java.util.Arrays.sort(數(shù)組); // JDK提供默認(rèn)的升序排序
5.5.1. 選擇排序
/*** @Description 選擇排序*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array={ 1, 2, 3, 4, 5}; // 選擇排序 sort (array); } /** * 使用選擇排序,對數(shù)組進(jìn)行排列 * @param array 需要排序的數(shù)組 */ public static void sort (int[] array) { int times=0; // 1. 固定下標(biāo),和后面的元素進(jìn)行比較 for(int i=0; i5.5.2. 冒泡排序
/*** @Description 冒泡排序*/public class Test { public static void main (String[] args) { // 實例化一個數(shù)組 int[] array={ 1, 2, 3, 4, 5}; // 冒泡排序 sort (array); } /** * 使用冒泡排序進(jìn)行升序排序 * @param array 需要排序的數(shù)組 */ public static void sort (int[] array) { // 1. 確定要進(jìn)行多少趟的比較 for(int i=0; iarray[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } }}5.6. 數(shù)組的查詢
數(shù)組查詢, 即查詢數(shù)組中的元素出現(xiàn)的下標(biāo)。
5.6.1. 順序查詢
順序查詢, 即遍歷數(shù)組中的每一個元素, 和要查詢的元素進(jìn)行對比。 如果是要查詢的元素, 這個下標(biāo)就是要查詢的下標(biāo)。
/*** @Description 順序查詢*/public class Test { public static void main (String[] args) { // 1. 實例化一個數(shù)組 int[] array={ 1, 3, 5, 7, 9, 0, 8, 8, 8, 6, 4, 8, 2}; // 2. 從這個數(shù)組中查詢元素8的下標(biāo) System.out.println (indexOf (array, 80)); } /** * 使用順序查詢法,從數(shù)組array中查詢指定的元素 * @param array 需要查詢的數(shù)組 * @param element 需要查詢的元素 * @return 下標(biāo) */ public static int indexOf (int[] array, int element) { // 1. 使用下標(biāo)遍歷法,依次獲取數(shù)組中的每一個元素 for(int i=0; i5.6.2. 二分查詢
二分查詢, 即利用數(shù)組中間的位置, 將數(shù)組分為前后兩個字表。 如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
二分查詢, 要求數(shù)組必須是排序的, 否則無法使用二分查詢。
/*** @Description 二分查詢*/public class Test { public static void main (String[] args) { int[] array = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; System.out.println (binarySearch (array, 14)); }? /** * 二分查詢,查詢數(shù)組中element出現(xiàn)的下標(biāo) * @param array 需要查詢的數(shù)組 * @param element 需要查詢的元素 * @return 元素出現(xiàn)的下標(biāo),如果數(shù)組中不包含這個元素,返回-1 */ public static int binarySearch (int[] array, int element) { // 1. 定義兩個變量,用來標(biāo)記需要查詢范圍的上限和下限 int max = array.length-1, min=0;? while(max>=min) { // 2. 計算中間下標(biāo) int mid = (max+min) /2;? // 3. 使用中間下標(biāo)的元素和要查詢的元素進(jìn)行比較 if(array[mid] == element) { // 說明找到了 return mid; } elseif (array[mid] >element) { // 中間位比要查詢的元素大 max = mid-1; } else{ // 中間位比要查詢的元素小 min = mid+1; } }? // 如果循環(huán)走完了,依然沒有結(jié)果返回,說明要查詢的元素在數(shù)組中不存在 return -1; }}?5.7. 可變長參數(shù)
5.7.1. 概念
可以接收多個類型相同的實參,個數(shù)不限,使用方式與數(shù)組相同。
在調(diào)用方法的時候, 實參的數(shù)量可以寫任意多個。
5.7.2. 語法
數(shù)據(jù)類型... 形參名 (必須放到形參列表的最后位,且只能有一個)
// 這里的參數(shù)paramters其實就是一個數(shù)組static void show (int... parameters) {// }5.7.3. 使用
/*** @Description 不定長的參數(shù)案例*/public class Test { public static void main (String[] args) {? // int[] array = { 1, 2, 3 }; // showArray(array);? // 如果一個方法的參數(shù),使用 ... 來定義,可以將這個數(shù)組中的元素,直接寫到實參列表中 // 注意事項: // 1. 在形參列表中,可變長度的參數(shù),必須在形參列表的最后位 // 2. 一個形參列表中,只能存在一個...修飾的可變長度參數(shù) showArray (1, 2, 3, 4, 5, 6, 7, 8, 9, 0); }? /** * 對數(shù)組array進(jìn)行遍歷 * @param array */ public static void showArray (int a, int... array) { for(int i : array) { System.out.print (i+", "); } }}5.8. 二維數(shù)組
5.8.1. 概念
二維數(shù)組, 其實就是數(shù)組中嵌套數(shù)組。
二維數(shù)組中的每一個元素都是一個小的數(shù)組。
理論上來講, 還可以有三維數(shù)組、四維數(shù)組, 但是常用的其實就是二維數(shù)組。
5.8.2. 定義與使用
/*** @Description 二維數(shù)組的定義與使用*/public class Array3 { public static void main (String[] args) { // 1. 實例化一個二維數(shù)組 // 第一個中括號中的3: 二維數(shù)組中包含了三個一維數(shù)組 // 第二個中括號中的5: 二維數(shù)組中的每一個一維數(shù)組長度為5 int[][] array = new int[3][5]; // 使用雙下標(biāo)訪問數(shù)組中的元素 array[0][3] = 10;? // 這里得到的,是二維數(shù)組的長度,3 System.out.println (array.length);?? // 2. 實例化一個二維數(shù)組 // 第一個中括號中的3: 二維數(shù)組中包含了三個一維數(shù)組 // 第二個中括號中什么都沒有,代表現(xiàn)在二維數(shù)組中的三個元素是 null int[][] array2 = new int[3][]; array2[0] = new int[] { 1, 2, 3};? // 3. 通過初始值實例化一個二維數(shù)組 int[][] array3 = { {1, 2, 3}, {1, 2, 3, 4, 5}, {2, 3, 4} }; }}5.9. Arrays工具類
5.9.1. 常用方法
5.9.2. 示例代碼
/*** @Description 二維數(shù)組的定義與使用*/public class ArraysUsage { // Arrays 工具方法: 可以便捷的實現(xiàn)指定操作的方法 // Arrays 工具類: 若干個工具方法的集合 public static void main (String[] args) { // 1. 實例化一個數(shù)組 int[] array = { 1, 3, 5, 7, 9, 0, 8, 6, 4, 2};? // 從原數(shù)組中拷貝指定數(shù)量的元素,到一個新的數(shù)組中,并返回這個新的數(shù)組 // 第一個參數(shù):源數(shù)組 // 第二個參數(shù):需要拷貝的元素數(shù)量,如果這個數(shù)量比源數(shù)組長,目標(biāo)數(shù)組剩余的部分補(bǔ)默認(rèn)值 int[] ret1 = Arrays.copyOf (array, 13);? // 從原數(shù)組中拷貝指定范圍 [from, to) 的元素,到一個新的數(shù)組中,并返回這個新的數(shù)組 // 第一個參數(shù):源數(shù)組 // 第二個參數(shù):起始下標(biāo),從這個下標(biāo)位的元素開始拷貝 // 第三個參數(shù):目標(biāo)下標(biāo),拷貝到這個下標(biāo)位截止 int[] ret2 = Arrays.copyOfRange (array, array.length, array.length+10);? // 判斷兩個數(shù)組是否相同 // 判斷的邏輯:長度、每一個元素依次都相等 boolean ret3 = Arrays.equals (ret1, ret2);? // 使用指定的數(shù)據(jù),填充數(shù)組 // 第一個參數(shù):需要填充的數(shù)組 // 第二個參數(shù):填充的數(shù)據(jù) Arrays.fill (ret2, 100);? // 對數(shù)組進(jìn)行排序(升序) Arrays.sort (array);? // 使用二分查找法,到數(shù)組中查詢指定的元素出現(xiàn)的下標(biāo) // 第一個參數(shù):需要查詢的數(shù)組 // 第二個參數(shù):需要查詢的數(shù)據(jù) // 返回:這個元素出現(xiàn)的下標(biāo),如果不存在,返回-1 int index = Arrays.binarySearch (array, 4);? // 將數(shù)組中的元素拼接成字符串返回 String str = Arrays.toString (array); System.out.println (str); }}總結(jié)
以上是生活随笔為你收集整理的多层数组如何遍历_带你从零学大数据系列之Java篇---第五章:数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycham窗口显示多个编辑页面
- 下一篇: influxdb数据过期_为什么腾讯QQ