[JavaSE] 数组的定义和使用(三)
目录
数组练习
💬 检查数组的有序性
💬 数组排序(冒泡排序)
💬 数组逆置
💬 数组数字排列
💬 填充数组
二维数组
基本定义
不规则二维数组

疫情当前,大家要做好防护哦。
带好口罩了嘛?
那么大家跟着Nick来学习数组(三)的知识!
数组练习
💬 检查数组的有序性
🔴 给定一个整型数组, 判断是否该数组是有序的(升序)
public class 判断有序 { public static void main(String[] args) { int[] arr={1,2,2}; System.out.println(isJudge(arr)); } public static boolean isJudge(int[] arr){ for (int i = 0; i arr[i+1]){ return false; } } return true; }}
💬 数组排序(冒泡排序)
🔴 给定一个数组, 让数组升序 (降序) 排序
🔴 每次尝试找到当前待排序区间中最小(或最大)的元素, 放到数组最前面(或最后面)
基础版本:
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) {// [0, bound) 构成了一个前闭后开区间, 表示已排序区间// [bound, length) 构成了一个前闭后开区间, 表示待排序区间// 每循环一次, 就找到一个合适大小的元素, 已排序区间就增大1. for (int bound = 0; bound bound; cur--) { if (arr[cur - 1] > arr[cur]) { int tmp = arr[cur - 1]; arr[cur - 1] = arr[cur]; arr[cur] = tmp; } } } // end for } // end bubbleSort}// 执行结果[2, 5, 7, 9]
改进版本:
import java.util.Arrays;//一步一步向后走,关键:一趟走完,发现没交换,说明已经有序了public class 冒泡 { public static void main(String[] args) { int[] arr={0,1,2,4,2,5,7}; bubbleSort(arr); System.out.println(Arrays.toString(arr)); } public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length-1; i++) { boolean flag=false; for (int j = 0; j arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag =true; } } if(flag==false){ break; } } }}
🔴 冒泡排序性能较低. Java 中内置了更高效的排序算法
public static void main(String[] args) { int[] arr = {9, 5, 2, 7}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
🔴 关于 Arrays.sort 的具体实现算法, Nick在数据结构的栏目详细介绍过了,介绍了很多种常见排序算法,大家感兴趣可以看一下。
💬 数组逆置
🔴 给定一个数组, 将里面的元素逆序排列.
🔴 设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素. 然后让前一个下标自增, 后一个下标自减, 循环继续即可
import java.util.Arrays;public class 数组逆置 { public static void main(String[] args) { int[] arr = {1,2,3,4,5,6}; 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 temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } }}
💬 数组数字排列
🔴 给定一个整型数组, 将所有的偶数放在前半部分, 将所有的奇数放在数组后半部分
例如 {1, 2, 3, 4} 调整后得到 {4, 2, 3, 1}
🔴 设定两个下标分别指向第一个元素和最后一个元素。 用前一个下标从左往右找到第一个奇数, 用后一个下标从右往左找到第一个偶数, 然后交换两个位置的元素.。依次循环即可.
import java.util.Arrays;public class 偶前奇后 { public static void main(String[] args) { //在数组里偶数在前,奇数在后(不分顺序) Integer[] arr ={5,7,9,2,3,4,1,8,10,3}; sort(arr); System.out.println(Arrays.toString(arr)); } public static void sort(Integer[] arr){ int left = 0; int right=arr.length-1; while(left<right){ // 该循环结束, left 就指向了一个奇数 while(left < right && arr[left] % 2 == 0){ left++; } // 该循环结束, right 就指向了一个偶数 while(left < right && arr[right]%2==1){ right--; } //这里就是单纯换个位置,可以写代码直接实现,Nick习惯写方法了,哈哈 exch(arr,left,right); } } public static void exch(Comparable[] arr,int x,int y){ Comparable temp; temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; }}
💬 填充数组
🔴 往数组中填充5个10
import java.util.Arrays;public class 填充 { public static void main(String[] args) { int[] arr =new int[10]; //数组填充 //首索引 尾索引 填充值 Arrays.fill(arr,0,5,12); //范围左闭右开[0,5) System.out.println(Arrays.toString(arr)); }}
🔴 往数组中赋值1-100
public class 数组1到100 { public static void main(String[] args) { int[] arr = new int[100]; int sum=0; for (int i = 0; i < arr.length; i++) { arr[i]=++sum; } }}
二维数组
基本定义
🔴 二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组
基本语法
数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
//三种常见的二维数组写法 int[][] arr01=new int[][]{{1,2,3},{4,5,6}}; int[][] arr02=new int[2][3]; int[][] arr={{1,2,3},{5,7,8}}; //输出行数(原理:存一维数组的数组长度) System.out.println(arr.length); //输出列数(原理:存储在一维数组当中的数组长度) //i指的是所在行数,求的是第i行有多少列 System.out.println(arr[i].length);
画图理解(重要)
📝 三种二维数组遍历
public static void main01(String[] args) { //int[][] arr=new int[][]{{1,2,3},{4,5,6}}; //int[][] arr=new int[2][3]; int[][] arr={{1,2,3},{5,7,8}}; //行 System.out.println(arr.length); //列 System.out.println(arr[i].length); //遍历1 for (int i = 0; i < arr.length; i++) { for (int j = 0; j <arr[i].length; j++) { System.out.print(arr[i][j]+" "); } System.out.println(); } System.out.println("=================="); //遍历2 //ret 行 一位数组中存着n个数组 //x 列 遍历得到每一行中的列值 for (int[] ret: arr){ for (int x: ret){ System.out.print(x+" "); } System.out.println(); } //遍历3 System.out.println("===================="); System.out.println(Arrays.deepToString(arr)); }
🔴 二维数组的用法和一维数组并没有明显差别, 因此我们不再赘述。 同理, 还存在 "三维数组", "四维数组" 等更复杂的数组, 只不过出现频率都很低
不规则二维数组
🔴 行确定,列不确定(行必须是确定的,不懂看图,没有行怎么存储列对吧~)
public class 二维数组 { public static void main(String[] args) {//打印测试/* int[][] arr={{1,2},{5,7,8}}; for (int[] ret: arr){ for (int x: ret){ System.out.print(x+" "); } System.out.println(); } System.out.println("======================");*/ //不规则二维数组,行确定,列不确定 int[][] arr2=new int[2][]; //数组arr2[0]存储一个长度为1的数组 arr2[0] = new int[3]; //数组arr2[1]存储一个长度为2的数组 arr2[1] = new int[2]; for (int[] str:arr2){ for (int s:str){ System.out.print(s+" "); } System.out.println(); } }
