Java.SE數(shù)組的一些常見練習(xí)題
1. 數(shù)組轉(zhuǎn)字符串
數(shù)組轉(zhuǎn)字符串我們需要借助工具類
代碼示例
import java.util.Arrays //Java中的包 public class TestDemo { public static int[] func() { return new int[]{1,2,3,4,5,6}; } public static void main(String[] args) { int[] ret = func(); //這個方法主要將參數(shù)的數(shù)組轉(zhuǎn)化為字符串輸出 String s = Arrays.toString(ret); //Ctrl+鼠標(biāo)點擊,可以跳轉(zhuǎn)到這個方法的原碼 System.out.println(s); } } //執(zhí)行結(jié)果 [1, 2, 3, 4, 5, 6]
使用這個方法后續(xù)打印數(shù)組就更方便一些.
Java 中提供了 java.util.Arrays
包,其中包含了一些操作數(shù)組的常用方法。
我們可以在jdk里搜索一下Arrays的用法,如圖所示:
1.1 自己實現(xiàn)一個tostring函數(shù)
定義一個myToString
的方法,利用for循環(huán)和if判斷來解決問題
代碼示例:
public class TestDemo { public static String myToString(int[] array){ String ret = "["; for (int i = 0; i < array.length; i++) { ret += array[i]; if (i != array.length -1){ ret += ","; } } ret += "]"; return ret; } public static void main(String[] args) { int[] array = {1,2,3,4,5}; String ret = myToString(array); System.out.println(ret); } }
打印結(jié)果:
2. 數(shù)組拷貝
先來看一個簡單的數(shù)組拷貝:
使用for循環(huán)
來完成的拷貝
public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5}; int[] copy = new int[array.length]; for (int i = 0; i < array.length; i++) { copy[i] = array[i]; } System.out.println(Arrays.toString(copy)); } }
打印結(jié)果:
以下代碼是不是拷貝
答案:不是
在上述代碼中我們可以通過修改形參的值來改變實參
// array3和array2引用的是同一個數(shù)組 // 因此array3修改空間中內(nèi)容之后,array2也可以看到修改的結(jié)果 int[] array2 = {1,2,3,4,5}; int[] array3 = array2; array3[0] = 10; System.out.println("newArr: " + Arrays.toString(array2));
我們可以不用for循環(huán)來拷貝數(shù)組,直接用Arrays中的copyof方法來完成
import java.util.Arrays public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5}; int[] copy = Arrays.copyOf(array,array.length); System.out.println(Arrays.toString(copy)); } }
//使用Arrays中copyOf方法完成數(shù)組的拷貝:
// copyOf方法在進(jìn)行數(shù)組拷貝時,創(chuàng)建了一個新的數(shù)組
// array和copy引用的不是同一個數(shù)組
數(shù)組的擴容:array.length
后 *2 就是擴大兩倍
代碼示例:
import java.util.Arrays public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5}; int[] copy = Arrays.copyOf(array,array.length*2); System.out.println(Arrays.toString(copy)); } }
運行結(jié)果:
拷貝某個范圍
代碼示例
public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5}; //取下標(biāo)為1到3的數(shù)字 int[] copy = Arrays.copyOfRange(array,1,3); System.out.println(Arrays.toString(copy)); } }
運行結(jié)果:
如果下標(biāo)范圍過大,則能拷貝多少拷貝多少,其余位置用0補全
畫圖對比看一下拷貝和指向的區(qū)別
注意: 數(shù)組當(dāng)中存儲的是基本類型數(shù)據(jù)時,不論怎么拷貝基本都不會出現(xiàn)什么問題,但如果存儲的是引用數(shù)據(jù)類型,拷貝時需要考慮深淺拷貝的問題,關(guān)于深淺拷貝在后續(xù)詳細(xì)給大家介紹。
crtl+鼠標(biāo)左鍵,單擊copyOfRange
來查看他的原碼看一下他是怎么運行的
在這里crtl+鼠標(biāo)左鍵,單擊arraycopy
,來看一下他是怎么實現(xiàn)的
可以看到他的參數(shù)如下圖所示:
按照以上參數(shù)用自己代碼實現(xiàn)如下:
public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5}; int[] copy = new int[array.length]; System.arraycopy(array,0,copy,0,array.length); System.out.println(Arrays.toString(copy)); } }
3. 求數(shù)組中元素的平均值
給定一個整型數(shù)組, 求平均值
代碼示例:
public static void main(String[] args) { int[] arr = {1,2,3,4,5,6}; System.out.println(avg(arr)); } public static double avg(int[] arr) { int sum = 0; for (int x : arr) { sum += x; } return (double)sum / (double)arr.length; //需要強轉(zhuǎn)成double型 } // 執(zhí)行結(jié)果 3.5
4. 查找數(shù)組中指定元素(順序查找)
給定一個數(shù)組, 再給定一個元素, 找出該元素在數(shù)組中的位置.
代碼示例:
public static void main(String[] args) { int[] arr = {1,2,3,10,5,6}; System.out.println(find(arr, 10)); } public static int find(int[] arr, int data) { for (int i = 0; i < arr.length; i++) { if (arr[i] == data) { return i;//找到返回下標(biāo) } } return -1; // 表示沒有找到 } // 執(zhí)行結(jié)果 3
5. 查找數(shù)組中指定元素(二分查找)
針對有序數(shù),可以使用更高效的二分查找。
什么叫有序數(shù)組?
有序分為 “升序” 和 “降序”
如 1 2 3 4 ,依次遞增即為升序。
如 4 3 2 1 ,依次遞減即為降序。
如果數(shù)組為無序數(shù)組,可以用 Arrays.sort(array)
這個方法對其進(jìn)行排序
代碼所示:
public class TestDemo { public static void main(String[] args) { int[] array = {1,3,2,6,4,5}; Arrays.sort(array); System.out.println(Arrays.toString(array)); } }
打印結(jié)果:
以升序數(shù)組為例,二分查找的思路是先取中間位置的元素,然后使用待查找元素與數(shù)組中間元素進(jìn)行比較:
- 如果相等,即找到了返回該元素在數(shù)組中的下標(biāo)
- 如果小于,以類似方式到數(shù)組左半側(cè)查找
- 如果大于,以類似方式到數(shù)組右半側(cè)查找
畫圖理解
當(dāng)我們想找的是4時
代碼示例:
public static void main(String[] args) { int[] arr = {1,2,3,4,5,6}; System.out.println(binarySearch(arr, 6)); } public static int binarySearch(int[] arr, int toFind) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (toFind < arr[mid]) { // 去左側(cè)區(qū)間找 right = mid - 1; } else if (toFind > arr[mid]) { // 去右側(cè)區(qū)間找 l eft = mid + 1; } else { // 相等, 說明找到了 return mid; } } // 循環(huán)結(jié)束, 說明沒找到 return -1; } // 執(zhí)行結(jié)果 5
可以看到,針對一個長度為 10000 個元素的數(shù)組查找,二分查找只需要循環(huán) 14 次就能完成查找。隨著數(shù)組元素個數(shù)越多,二分的優(yōu)勢就越大。
我們也可以直接調(diào)用Java中的binarySearch
方法來直接找下標(biāo)
代碼演示:
public class TestDemo { public static void main(String[] args) { int[] array = {1,3,2,6,4,5}; Arrays.sort(array); System.out.println(Arrays.binarySearch(array,5)); } }
運行結(jié)果:
擴展:Java中的Attays方法
例如:比較兩個數(shù)組兩個對應(yīng)位置數(shù)字的大小是否相等用Arrays.equals()
的方法
代碼演示:
public static void main(String[] args) { int[] array1 = {1,2,3,4,5}; int[] array2 = {1,2,3,4,5}; boolean flg = Arrays.equals(array1,array2); System.out.println(flg); }
結(jié)果為
填充一個數(shù)組時用Arrays.fill()
的方法
代碼演示:
public static void main(String[] args) { int[] array3 = new int[10]; Arrays.fill(array3,-1); System.out.println(Arrays.toString(array3)); }
打印結(jié)果為:
也可選擇填充位置 Arrays.fill(array3,1,4,-1);
,把括號里邊改成1~4下標(biāo)的數(shù)字,填充為-1
6. 數(shù)組排序(冒泡排序)
給定一個數(shù)組, 讓數(shù)組升序 (降序) 排序。
假設(shè)排升序:
- 將數(shù)組中相鄰元素從前往后依次進(jìn)行比較,如果前一個元素比后一個元素大,則交換,一趟下來后最大元素就在數(shù)組的末尾
- 依次從上述過程執(zhí)行,直到數(shù)組中所有的元素都排列好
我們來看一下4,8,9,3,6的排序圖
代碼示例:
public class TestDemo { public static void bubbleSort(int[] array) { //i代表的是趟數(shù)?。? for (int i = 0; i < array.length-1; i++) { //j代表每一趟比較的次數(shù) boolean flg = false; for (int j = 0; j < array.length-1-i; j++) { if(array[j] > array[j+1]) { int tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; flg = true; } } if(flg == false) { break;//說明有序了?。?! } } } public static void main(String[] args) { int[] arr = {9, 5, 2, 7}; bubbleSort(arr); System.out.println(Arrays.toString(arr)); } } //運行結(jié)果 [2, 5, 7, 9]
冒泡排序性能較低。Java 中內(nèi)置了更高效的排序算法
public static void main(String[] args) { int[] arr = {9, 5, 2, 7}; Arrays.sort(array); System.out.println(Arrays.toString(array)); }
關(guān)于 Arrays.sort 的具體實現(xiàn)算法, 我們在后面的排序算法課上再詳細(xì)介紹. 到時候我們會介紹很多種常見排序算法.
7. 數(shù)組逆序
給定一個數(shù)組,將里面的元素逆序排列。
思路設(shè)定兩個下標(biāo),分別指向第一個元素和最后一個元素,交換兩個位置的元素,然后讓前一個下標(biāo)自增,后一個下標(biāo)自減,循環(huán)繼續(xù)即可。
代碼示例:
public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; reverse(arr); System.out.println(Arrays.toString(arr)); } public static void reverse(int[] arr) { int left = 0; int right = arr.length - 1; while (left < right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } }
運行結(jié)果:
庫里邊沒有方法可以直接數(shù)組逆序
8. 二維數(shù)組
二維數(shù)組本質(zhì)上也就是一維數(shù)組,只不過每個元素又是一個一維數(shù)組。
基本語法
數(shù)據(jù)類型[][] 數(shù)組名稱 = new 數(shù)據(jù)類型 [行數(shù)][列數(shù)] { 初始化數(shù)據(jù) };
初始化示例:
int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; int[][] arr1 = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; int[][] arr2 = new int[2][3]
通過array[行][列]
的坐標(biāo)來訪問某一個值
圖解:
代碼示例:
int[][] arr = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.printf("%d\t", arr[i][j]); } System.out.println(""); } // 執(zhí)行結(jié)果 1 2 3 4 5 6 7 8 9 10 11 12
二維數(shù)組的用法和一維數(shù)組并沒有明顯差別,因此我們不再贅述。
同理,還存在 “三維數(shù)組”,“四維數(shù)組” 等更復(fù)雜的數(shù)組,只不過出現(xiàn)頻率都很低。
我們?nèi)绻胫苯哟蛴《S數(shù)組要用什么呢?
我們知道一維數(shù)組的打印用Arrays.toString()
,但是用它打印二維數(shù)組打印的是數(shù)組的地址
所以我們要用Arrays.deepToString()
的方法直接打印二維數(shù)組
代碼演示:
int[][] arr = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; System.out.println(Arrays.deepToString(arr));
不規(guī)則的二維數(shù)組代碼演示:
public static void main(String[] args) { int[][] array = new int[2][]; array[0] = new int[]{1,2,3}; array[1] = new int[]{4,5,6,7,8,9}; System.out.println(Arrays.deepToString(array)); } //運行結(jié)果 [[1, 2, 3], [4, 5, 6, 7, 8, 9]]
可以指定二維數(shù)組的長度,這時可以省略他的列
畫圖解釋:
總結(jié)
到此這篇關(guān)于Java.SE數(shù)組的一些常見練習(xí)題的文章就介紹到這了,更多相關(guān)Java.SE數(shù)組練習(xí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea創(chuàng)建springboot項目,Application.java不能運行問題及解決
這篇文章主要介紹了idea創(chuàng)建springboot項目,Application.java不能運行問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11詳解Java對象的強、軟、弱和虛引用+ReferenceQueue
這篇文章主要介紹了詳解Java對象的強、軟、弱和虛引用+ReferenceQueue的相關(guān)資料,需要的朋友可以參考下2017-06-06EntityWrapper如何在and條件中嵌套o(hù)r語句
這篇文章主要介紹了EntityWrapper如何在and條件中嵌套o(hù)r語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03關(guān)于java中可變長參數(shù)的定義及使用方法詳解
下面小編就為大家?guī)硪黄P(guān)于java中可變長參數(shù)的定義及使用方法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12Springboot自動裝配之注入DispatcherServlet的實現(xiàn)方法
這篇文章主要介紹了Springboot自動裝配之注入DispatcherServlet,Springboot向外界提供web服務(wù),底層依賴了springframework中的web模塊來實現(xiàn),那么springboot在什么時機向容器注入DispatcherServlet這個核心類的呢?帶著這個問題一起通過本文學(xué)習(xí)吧2022-05-05