二维数组(Dyadic Array)
一维数组 : 数组中直接存放数据
二维数组 : 数组中存放数组
二维数组可以看成以数组为元素的数组。就是一个特殊的一维数组,其每一个元素都是一个一维数组
String[][] str = new String[3][4];//String类型二维数组举例
其实多维数组不仅仅只有二维数组,还有三维数组,四维数组…, 但是三维以上很少见到,所以大家重点了解二维数组即可.
1.举例
int [][] a = {{1,2},{3,4,0,9},{5,6,7}};
2.二维数组的声明
数据类型 变量名; -->变量声明 数据类型[] 数组名; -->一维数组声明 数据类型[][] 数组名; -->二维数组声明
3.二维数组的初始化
3.1.动态初始化
数组定义与为数组元素分配空间和赋值的操作分开进行
数据类型[][] 数组名 = new 数据类型[一维][二维];
注意:这种初始化方式,每一个内层的二位数组长度相同
int[][] a=new int[3][2]; a[0][0] = 1; a[0][1] = 2;
动态初始化 : 创建二维数组的同时赋值(内部一维数组创建+每一个一维数组中的数据) 创建外层二维数组同时创建内层每一个一维刷组+没有赋值数据,存在默认值 数据类型[][] 数组名 = new 数据类型[外层二维数组长度][内层一维数组长度]; 创建外层二维数组,内层每一个一维数组在后续确定时单独创建+赋值数据 数据类型[][] 数组名 = new 数据类型[外层二维数组长度][];
int[][] a=new int[3][]; arr[0]=new int[2]; arr[1]=new int[]{3,4,5,6}; arr[2]=new int[]{7,8,9}; arr[0][0] = 1; arr[0][1] = 2;
3.2.静态初始化
在定义数组的同时就为数组元素分配空间并赋值
数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}}; 数据类型[][] 数组名 = {{...},{...},{...}}; --简化写法
int[][] arr1=new int[][]{{5,4,8},{3,8},{1}}; char[][] arr2={{'a'},{'b','c'}};
4.二维数组的使用
- 根据索引进行使用
- 数组数组名 [外层二维索引] [内层一维索引]
4.1.数组的遍历
双重循环实现多维数组的遍历
/* 二维数组的遍历方式 : 1.for 2.foreach 以上两种循环任意嵌套 */ public class ArrayTest { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},{6}}; // for循环嵌套加强for //for-->foreach for(int i=0;i
// for(int j:arr[i]){ System.out.println(j); } } // 两个加强for嵌套 //foreach-->foreach for(int[] a:arr){ for(int i:a){ System.out.println(i); } } } } public class AraayEachTest { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},{6,7}}; //for嵌套for for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.println(arr[i][j]); } } //System.out.println(Arrays.deepToString(arr));//返回指定数组内容的字符串表示形式。 //for 嵌套each for (int i = 0; i < arr.length; i++) { for (int a:arr[i] ) { System.out.println(a); } } // //each 嵌套each // for (int[] a:arr // ) {// for (int b:a // ) {// System.out.println(b); // } // } // //each 嵌套for // for (int[] i:arr // ) {// for (int j = 0; j < i.length; j++) {// System.out.println(i[j]); // } // } } }
Arrays中提供操作多维数组的方法:
package com.arraytest; import java.util.Arrays;//它提供的所有方法都是静态的。 public class AraayEachTest { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},{6,7}}; int[][] arr2 = {{1,2,3},{4,5},{6,7}}; int[][] arr1 = {{1,2,3},{4,5},{6,7}}; int[] arr3 = {3,1,5,8,9}; System.out.println(arr1);//打印对象地址 System.out.println(Arrays.deepToString(arr1));//返回指定数组的“深层内容”的字符串表示形式 System.out.println(arr== arr2);//false 地址不一样 System.out.println(Arrays.equals(arr,arr2));//false System.out.println(Arrays.deepEquals(arr,arr2));//如果两个数组彼此深度相等,则返回 true //将数组升序排序 System.out.println(Arrays.toString(arr3)); Arrays.sort(arr3); System.out.println(Arrays.toString(arr3)); //二进制搜索指定值 System.out.println(Arrays.binarySearch(arr3,8));//数值8在下标3的位置 System.out.println(Arrays.binarySearch(arr3,10));//-6如果不存在,返回 -插入点-1 System.out.println(Arrays.binarySearch(arr3,100));//-6 } }
import java.lang.reflect.Array; import java.util.Arrays; /* Arrays : 该类包含用于操作数组的各种方法(例如排序和搜索)。 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。具有但不限于以下功能: 给数组赋值:通过fill方法。 对数组排序:通过sort方法,按升序。 比较数组:通过equals方法比较数组中元素值是否相等。 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。 */ public class Class001_Arrays { public static void main(String[] args) { int[] arr1 ={3,1,5,2,4}; int[] arr2 ={3,1,5,2,4}; int[] arr5 ={13,1,5,2,14}; int[][] arr3 = {{1,2,3},{4,5},{6}}; int[][] arr4 = {{1,2,3},{4,5},{6}}; //static String toString(int[] a) 返回指定数组内容的字符串表示形式。 System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr3)); //static String deepToString(Object[] a) 返回指定数组的“深层内容”的字符串表示形式。 System.out.println(Arrays.deepToString(arr3)); //static boolean equals(int[] a, int[] a2) 如果两个指定的int数组彼此 相等 ,则返回 true 。 System.out.println(arr1==arr2); System.out.println(Arrays.equals(arr1,arr2)); //static boolean deepEquals(Object[] a1, Object[] a2) 如果两个指定的数组彼此 深度相等 ,则返回 true 。 System.out.println(Arrays.deepEquals(arr3,arr4)); //static boolean equals(int[] a, int aFromIndex, int aToIndex, int[] b, int bFromIndex, int bToIndex) 如果指定范围内的两个指定的int数组彼此 相等 ,则返回true。 System.out.println(Arrays.equals(arr2,1,4,arr5,1,4)); //static void fill(int[] a, int val) 将指定的int值分配给指定的int数组的每个元素。 //static void fill(int[] a, int fromIndex, int toIndex, int val) 将指定的int值分配给指定的int数组的指定范围的每个元素。 //注意 : 一般指定结束索引位置都不包含 int[] arr6 = new int[10]; System.out.println(Arrays.toString(arr6)); Arrays.fill(arr6,100); System.out.println(Arrays.toString(arr6)); Arrays.fill(arr6,3,6,1); System.out.println(Arrays.toString(arr6)); //static void sort(int[] a) 将指定的数组按升序排序。 System.out.println(Arrays.toString(arr1)); Arrays.sort(arr1); System.out.println(Arrays.toString(arr1)); //static void sort(int[] a, int fromIndex, int toIndex) 按升序对数组的指定范围进行排序。 System.out.println(Arrays.toString(arr2)); Arrays.sort(arr2,1,4); System.out.println(Arrays.toString(arr2)); //定义字符数组|字符串数组|double数组,使用Arrays.sort对其数据做升序排序 //static int binarySearch(int[] a, int key) 使用二进制搜索算法在指定的int数组中搜索指定的值。 System.out.println(Arrays.binarySearch(arr1,6)); //如果不存在,返回-插入点-1 } }
5.附部分练习题
5.1 二维数组遍历求和操作:
用二重循环求出二维数组b所有元素的和
package com.task.d11_array; /*6.二维数组遍历求和操作:用二重循环求出二维数组b所有元素的和: int[][] b={{11},{21,22},{31,32,33}}*/ public class Sum06 {//双层普通for循环 public static void main(String[] args) { int sum = 0;//计数器 int[][] b={{11},{21,22},{31,32,33}};//数组静态初始化 for (int i = 0; i < b.length; i++) {//遍历外层二维数组 for (int j = 0; j < b[i].length; j++) {//遍历内层一维数组 sum += b[i][j];//两个下标位置识别一个数 } } System.out.println(sum);//输出150 } } /*接下来其余三种组合的循环遍历*/ class S2{//第二种,普通for,内层嵌套foreach public static void main(String[] args) { int sum = 0; int[][] b={{11},{21,22},{31,32,33}};//数组静态初始化 for (int i = 0; i < b.length; i++) {//外层普通for for (int j:b[i]) {//内层增强for sum += j;//每次循环出一个数j } } System.out.println(sum);//输出150 } } class S3{//第三种两层foreach循环嵌套 public static void main(String[] args) { int sum = 0; int[][] b={{11},{21,22},{31,32,33}};//数组静态初始化 for(int[] a:b){//外层循环,得到一个数组,因此用int[]类型接收,数组名是a for(int i:a){//内层循环,a数组,得到每一个值 sum += i; } } System.out.println(sum); } } class S4{//第四种 外层foreach 嵌套内层for循环 public static void main(String[] args) { int sum = 0; int[][] b={{11},{21,22},{31,32,33}};//数组静态初始化 for(int[] a:b){ for (int i = 0; i < a.length; i++) {//循环遍历a数组 sum += a[i];//得到每一个索引i位置的元素 } } System.out.println(sum); } }
5.2 数组查找操作:
定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”,不包含就打印出“No”。
package com.task.d11_array; import java.util.Scanner; /*1.数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”,不包含就打印出“No”。*/ public class Check01 { public static void main(String[] args) { String[] arr = new String[10];//定义长度为10的一维字符串数组 arr[0] = "lbj";//给数组赋值 arr[1] = "kb"; arr[2] = "kd"; arr[3] = "cp3"; arr[4] = "kaka"; arr[5] = "messi"; arr[6] = "ad"; arr[7] = "kg"; arr[8] = "dw"; arr[9] = "msn"; Scanner sc = new Scanner(System.in);//创建对象 System.out.println("请输入需要查找的内容:"); String in = sc.next();//使用功能,接收键盘输入信息 boolean flag = false;//布尔类型声明并赋值 for(String s:arr){//foreach遍历 if(s.equals(in)){//用equals方法比较是否对象深度内容相同 flag = true; } } if(flag){ System.out.println("YES"); }else{ System.out.println("NO"); } } }
/*数组排序及元素查找*/ public class ArrOrder { public static void main(String[] args) throws Exception{//main方法,抛出异常 int[] arr = { 2, 5, -2, 6, -3, 8, 0, -7, -9, 4 }; Arrays.sort(arr);//sort方法给数组排序 printArr("数组排序结果是:",arr); System.out.println("-----------换行----------"); int index = Arrays.binarySearch(arr,4);//查找数组中元素 System.out.println("元素4的下标位置是"+index); } private static void printArr(String str,int[] arr){ System.out.println(str+"[数组长度:"+ arr.length +"]"); for (int i:arr ) { System.out.print(" "+i); } } } /*数组排序结果是:[数组长度:10] -9 -7 -3 -2 0 2 4 5 6 8-----------换行---------- 元素4的下标位置是6*/
5.3 获取数组最大值和最小值操作
package com.task.d11_array; /*获取数组最大值和最小值操作:利用Java的Math类的random()方法,编写 函数得到0到n之间的随机数,n是参数。并找出产生50个这样的随机数中最大的、最小 的数,并统计其中>=60的有多少个。*/ public class GetMaxMin02 { public static void main(String[] args) { int[] arr = getArray(100); printArr(arr); int min = getMin(arr); int max = getMax(arr); System.out.println("数组中最大值和最小值分别是"+max+"和"+min); int count = count(arr,60); System.out.println("数组中大于或者等于60的数的个数是"+count); } //创建一个数组对象,并且初始化50个随机数 public static int[] getArray(int n){ int[] arr = new int[50];//静态声明,长度50个 for (int i = 0; i < 50; i++) {//遍历 arr[i] = (int)(n*Math.random());//给每个索引赋值随机数 } return arr; } //数组遍历 private static void printArr(int[] arr){ System.out.println("输出数组元素"); for (int i = 0; i < arr.length; i++) { if(i%10 == 0){ System.out.println(); } System.out.print(arr[i]+"\t"); } } //最大值 private static int getMax(int[] arr){ int max = arr[0]; for(int m:arr){ if(max < m){ max = m; } } return max; } //最小值 private static int getMin(int[] arr){ int min = arr[0]; for (int i = 0; i < arr.length; i++) { if(min > arr[i]){ min = arr[i]; } } return min; } //统计数组中大于等于60 public static int count(int[] arr,int num){ int count = 0; for(int v:arr){ if(v >= num){ count++; } } return count; } }
/*数组倒序实例*/ public class ReverseTest { private static int[] reverse; public static void main(String[] args) { int[] arr1 = {1,3,4,7,9}; for(int i:arr1){ System.out.print(i+" ");//不换行遍历输出原来数组内容 } System.out.println("\n"); arr1 = ReverseTest.reverse(arr1); for(int i: arr1){ System.out.print(i+" "); } } public static int[] reverse(int[] arr){//返回值是新数组配合return 形参是数组 int[] res = new int[arr.length];//动态声明初始化新数组,数组长度不变 for (int i = 0, j = res.length-1; i < arr.length ;i++,j--) { res[j] = arr[i];//新数组最后一位就等于原数组第一位 } return res;//返回新数组 } }
5.4 获取数组长度
/*获取数组长度*/ public class Arr_Length { public static void main(String[] args) { String[][] str = new String[3][8]; System.out.println("第一维数组长度是:"+str.length); System.out.println("第二维数组长度是:"+str[0].length); /*第一维数组长度是:3 第二维数组长度是:8*/ int[][] arr = {{1,2},{3,4,5},{6,7,8,9}}; int rows = arr.length;//行的长度 int cols = arr[0].length;//列的长度 int c = arr[1].length; int co = arr[2].length; System.out.println(rows);//3 System.out.println(cols);//2 System.out.println(c);//3 System.out.println(co);//4 } }
5.5 数组反转
import java.util.Arrays; import java.util.Collection; import java.util.Collections; /*数组倒序实例*///数组反转 public class ReverseTest { private static int[] reverse; //方法一测试 public static void main(String[] args) { int[] arr1 = {1,3,4,7,9}; for(int i:arr1){ System.out.print(i+" ");//不换行遍历输出原来数组内容 } System.out.println("\n"); arr1 = ReverseTest.reverse(arr1);//调用方法一 for(int i: arr1){ System.out.print(i+" "); } System.out.println("----------"); //调用方法二测试 int[] arr3 = {1,2,3,4}; rever(arr3,arr3.length); /*9 7 4 3 1 反转后的数组是: 1 3 4 7 9 */ System.out.println("==========="); //调用方法三测试 int[] arr4 = {10,11,12,14,17}; runoobtest(arr4,arr4.length); System.out.println("---------"); //方法四测试 Integer[] arr2 = {1,2,3,4,5}; re(arr2);//[5, 4, 3, 2, 1] } //方法一 public static int[] reverse(int[] arr){//返回值是新数组配合return 形参是数组 int[] res = new int[arr.length];//动态声明初始化新数组,数组长度不变 for (int i = 0, j = res.length-1; i < arr.length ;i++,j--) { res[j] = arr[i];//新数组最后一位就等于原数组第一位 } return res;//返回新数组 } //方法二: public static void rever(int[] arr,int n){ int[] arr1 = new int[n]; int j = n; for (int i = 0; i < n; i++) { arr1[j-1] = arr[i]; j--; } System.out.println("反转后的数组是:"); for (int i = 0; i < n; i++) { System.out.print(arr1[i]+" "); } } //方法三: public static void runoobtest(int[] arr,int n){ //0和n-1换,1和n-1-1换,2和-n-1-2换 int c; for (int i = 0; i < n/2 ; i++) { c = arr[i]; arr[i] = arr[n-i-1]; arr[n-i-1] = c; } System.out.println("新数组是:\n"); for (int j = 0; j < n; j++) { System.out.print(arr[j]+" "); } } //方法四: static void re(Integer arr[]){ Collections.reverse(Arrays.asList(arr)); System.out.println(Arrays.asList(arr)); } }
5.6 杨辉三角
public class YangHuiTest { public static void main(String[] args) { int[][] arr = new int[10][]; arr[0] = new int[]{1}; arr[1] = new int[]{1,1}; for (int i = 2; i < arr.length; i++) { arr[i] = new int[i+1]; arr[i][0] = arr[i][i] = 1; for (int j = 1; j < i; j++) { arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; } } for (int[] arr1:arr ) { for (int i:arr1 ) { System.out.print(i+" "); } System.out.println(); } } } //打印结果如下 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
寄 语:
我们与成功之间并不遥远,
许多非凡的成就只不过是简单坚持的结果, 关键是要守住你的初心~``