四、数组练习
4.1 数组转字符串
示例
import java.util.Arrays int[] arr = {1,2,3,4,5,6}; String newArr = Arrays.toString(arr); System.out.println(newArr);
Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法。
4.2 数组拷贝
import java.util.Arrays public static void func() { int[] arr = {1, 2, 3, 4, 5, 6}; int[] newArr = arr;//引用同一数组 newArr[0] = 10; System.out.println("newArr: " + Arrays.toString(arr)); System.out.println("newArr: " + Arrays.toString(newArr)); } public static void main(String[] args) { func(); }
arr[0] = 1; newArr = Arrays.copyOf(arr, arr.length);+//拷贝 System.out.println("newArr: " + Arrays.toString(newArr));
arr[0] = 10; System.out.println("arr: " + Arrays.toString(arr)); System.out.println("newArr: " + Arrays.toString(newArr));
int[] newArr2 = Arrays.copyOfRange(arr, 2, 4); System.out.println("newArr2: " + Arrays.toString(newArr2));
int[] copy = new int[arr.length]; //拷贝函数(原数组,目标数组,目标位置,长度) System.arraycopy(arr,0,copy,0,arr.length); System.out.println(Arrays.toString(copy));
4.3 求数组中元素的平均值
给定一个整型数组, 求平均值。
示例
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; }
4.4 查找数组中指定元素(顺序查找)
给定一个数组, 再给定一个元素, 找出该元素在数组中的位置。
示例
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; } } return -1; }
4.5查找数组中指定元素(二分查找)
针对有序数组, 可以使用更高效的二分查找,有序数组指元素依次增大或依次减小的数组。以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较,如果相等,即找到了返回该元素在数组中的下标,如果小于,以类似方式到数组左半侧查找,如果大于,以类似方式到数组右半侧查找。
示例
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]) { // 去左侧区间找 right = mid - 1; } else if (toFind > arr[mid]) { // 去右侧区间找 left = mid + 1; } else { // 相等, 说明找到了 return mid; } } // 循环结束, 说明没找到 return -1; }
4.6数组排序(冒泡排序)
给定一个数组, 让数组升序 (降序) 排序,分析:假设升序,将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾,依次从上上述过程,直到数组中所有的元素都排列好
示例
import java.util.Arrays; public static void main(String[] args) { int[] arr = {9, 5, 2, 7}; bubbleSort(arr); System.out.println(Arrays.toString(arr)); } public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 1; j < arr.length-i; j++) { if (arr[j-1] > arr[j]) { int tmp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = tmp; } } } }
冒泡排序性能较低. Java 中内置了更高效的排序算法
import java.util.Arrays; public static void main(String[] args) { int[] arr = {9, 5, 2, 7}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
4.7数组逆序
给定一个数组, 将里面的元素逆序排列,分析:设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素,然后让前一个下标自增, 后一个下标自减, 循环继续即可。
示例
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--; } }
4.8数组的其他相关函数
//比较、填充函数equals、fill import java.util.Arrays; public static void main(String[] args) { int[] array1 = {2,4,6,3}; int[] array2 = {2,4,6,3,10}; //比较函数equals,结果为true或false System.out.println(Arrays.equals(array1, array2)); int[] array = new int[10]; //填充函数fill(数组地址,起始位置,终止位置(左闭右开),值) Arrays.fill(array,0,3,9);//[0,3) //转换为字符串 System.out.println(Arrays.toString(array)); }
五、二维数组
5.1二维数组的定义及初始化
二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。
基本语法:
数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
import java.util.Arrays; public static void main11(String[] args) { int[][] array = {{1,2,3},{4,5,6}}; int[][] array2 = new int[][]{{1,2,3},{4,5,6}}; int[][] array3 = new int[2][3]; //行 不能省略 报错 //int[][] array4 = new int[][3]; //不规则二维数组 int[][] array5 = new int[2][]; System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(array2)); System.out.println(Arrays.toString(array3)); }
array,array2,array3存放相应数组的地址。
5.2 二维数组的遍历
for循环遍历二维数组
import java.util.Arrays; public static void main(String[] args) { int[][] array = {{1,2,3},{4,5,6}}; System.out.println(array[0][1]); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(array[i][j] +" "); } System.out.println(); } }
foreach遍历二维数组
import java.util.Arrays; public static void main13(String[] args) { int[][] array = {{1,2,3},{4,5,6}}; System.out.println(array.length); System.out.println(array[0].length); System.out.println(array[1].length); for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j] +" "); } System.out.println(); } System.out.println("===="); //深度(全部)转化为字符串 System.out.println(Arrays.deepToString(array)); System.out.println("===="); //foreach循环 for(int[] tmp : array) { for(int x : tmp) { System.out.print(x+" "); } System.out.println(); } }
不规则二维数组的初始化和遍历
import java.util.Arrays; public static void main(String[] args) { int[][] array = new int[2][]; array[0] = new int[]{1,2}; array[1] = new int[]{1,2,3}; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j] +" "); } System.out.println(); } }