Java数组、排序和查找

数组

基本介绍

  • 数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型
  • 即:数(数据)组(一组)就是一组数据
public class Array01 {
	//编写一个main函数
	public static void main(String[] args) {
		//一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。
		//请问这六只鸡的总体重是多少?平均体重是多少? 请你编一个程序
		//
		//思路分析
		//1. 定义六个变量 double 求和
		//2. 平均体重 = 总体重 / 6
		//3. 分析传统实现的方式问题:6->600 - 麻烦
		//4. 引出新的技术->数组

		// double hen1 = 3;
		// double hen2 = 5;
		// double hen3 = 1;
		// double hen4 = 3.4;
		// double hen5 = 2;
		// double hen6 = 50;

		// double totalWeight = hen1 + hen2 + hen3 + hen4 + hen5 + hen6;
		// double avgWeight = totalWeight / 6;

		// System.out.println("总体重=" + totalWeight);
		// System.out.println("平均体重=" + avgWeight);

		//用数组来解决问题
		//定义一个数组
		//1. double[] 表示是 double类型的数组,数组名 hens
		//2. {3, 5, 1, 3.4, 2, 50} 表示数组的值/元素,依次表示数组的第几个元素
		//
		double[] hens = {3, 5, 1, 3.4, 2, 50};
		//遍历数组 得到数组的所有元素的和:使用for循环
		//1. 我们可以通过 hens[下标] 来访问数组的元素,
		//   下标从0开始编号的,比如第一个元素就是 hens[0]
		//   第2个元素就是 hens[1] ,依此类推
		//2. 通过for循环就可以循环的访问数组的元素/值
		//3. 使用一个变量 totalWeight 将各个元素累积
		System.out.println("===使用数组解决===");
		//在java中,可以通过 数组名.length 得到数组的大小/长度
		System.out.println("数组的长度=" + hens.length);
		double totalWeight = 0;
		for (int i = 0; i < hens.length; i++) {
			//System.out.println("第" + (i+1) + "个元素的值=" + hens[i]);
			totalWeight += hens[i];
		}
		System.out.println("总体重=" + totalWeight);
		System.out.println("平均体重=" + (totalWeight / hens.length));
	}
}

img

数组的使用

使用方式1-动态初始化

数组的定义:

数据类型 数组名[] = new 数据类型[大小] - 另外:[]可以写在数据类型后面,也可以写在数组名后面

int a[] = new int[5];//创建了一个数组,名字为a,存放5个int

  • 说明:这是定义数组的一种方法

img

数组的引用(使用/访问/获取数组元素):

数组名[下标/索引/index] 比如:你要使用a数组的第3个数 - a[2]

注意:数组的下标从0开始

import java.util.Scanner;
public class Array02 {
	//编写一个main函数
	public static void main(String[] args) {
		//演示 数据类型 数据名[] = new 数据类型[大小]
		//要求:循环输入5个成绩,保存到double数组,并输出
		//步骤
		//1. 创建一个 double 数组,大小为5
        
		//(1)第一种动态分配方式
		double scores[] = new double[5];
        
		//循环输入
		//scores.length 表示数组的大小/长度
		Scanner myScanner = new Scanner(System.in);
		for (int i = 0; i < scores.length; i++) {
			System.out.println("请输入第" + (i+1) + "个元素的值");
			scores[i] = myScanner.nextDouble();
		}
		//输出,遍历数组
		System.out.println("当前数组的元素/值的情况如下:");
		for (int i = 0; i < scores.length; i++) {
			System.out.println("第" + (i+1) + "个元素的值=" + scores[i]);
		}
	}
}

img

使用方式2-动态初始化

先声明数组:

语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;

int a[]; 或者 int[] a;

创建数组:

语法:数组名 = new 数据类型[大小]

a = new int[10];

import java.util.Scanner;
public class Array02 {
	//编写一个main函数
	public static void main(String[] args) {
		//演示 数据类型 数据名[] = new 数据类型[大小]
		//要求:循环输入5个成绩,保存到double数组,并输出
		//步骤
		//1. 创建一个 double 数组,大小为5
        
		//(2)第二种动态分配方式,先声明数据,再 new 分配空间
		double scores[];//声明数组
		scores = new double[5];//分配了内存空间,可以存放数据
		//循环输入
		//scores.length 表示数组的大小/长度
		Scanner myScanner = new Scanner(System.in);
		for (int i = 0; i < scores.length; i++) {
			System.out.println("请输入第" + (i+1) + "个元素的值");
			scores[i] = myScanner.nextDouble();
		}
		//输出,遍历数组
		System.out.println("当前数组的元素/值的情况如下:");
		for (int i = 0; i < scores.length; i++) {
			System.out.println("第" + (i+1) + "个元素的值=" + scores[i]);
		}
	}
}

img

使用方式3-静态初始化

初始化数组:

语法:数据类型 数组名[] = {元素值1, 元素值2, …};

int a[] = {2, 5, 6, 7, 89, 90, 34, 56};//如果知道数组有多少元素,可以在[]内写上具体值

public class Array01 {
	//编写一个main函数
	public static void main(String[] args) {
		//一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。
		//请问这六只鸡的总体重是多少?平均体重是多少? 请你编一个程序
		
		//用数组来解决问题
		//定义一个数组
		//1. double[] 表示是 double类型的数组,数组名 hens
		//2. {3, 5, 1, 3.4, 2, 50} 表示数组的值/元素,依次表示数组的第几个元素
		//
		double[] hens = {3, 5, 1, 3.4, 2, 50};

		//遍历数组 得到数组的所有元素的和:使用for循环
		//1. 我们可以通过 hens[下标] 来访问数组的元素,
		//   下标从0开始编号的,比如第一个元素就是 hens[0]
		//   第2个元素就是 hens[1] ,依此类推
		//2. 通过for循环就可以循环的访问数组的元素/值
		//3. 使用一个变量 totalWeight 将各个元素累积
		System.out.println("===使用数组解决===");
		//在java中,可以通过 数组名.length 得到数组的大小/长度
		System.out.println("数组的长度=" + hens.length);
		double totalWeight = 0;
		for (int i = 0; i < hens.length; i++) {
			//System.out.println("第" + (i+1) + "个元素的值=" + hens[i]);
			totalWeight += hens[i];
		}
		System.out.println("总体重=" + totalWeight);
		System.out.println("平均体重=" + (totalWeight / hens.length));
	}
}

img

数组使用注意事项和细节

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
public class ArrayDetail {
	//编写一个main函数
	public static void main(String[] args) {
		//1. 数据是多个相同类型数据的组合,实现对这些数据的统一管理
		//int arr1[] = {1, 2, 3, 60}//ok
		//int arr1[] = {1, 2, 3, 60, 1.1}//error double->int
		//int arr1[] = {1, 2, 3, 60, "hello"}//error Sring->int
		
		//double arr2[] = {1.1, 2.2, 3, 60};//ok
		double arr2[] = {1.1, 2.2, 3, 60.6, 100};//ok int -> double 自动转换
	}
}

img

img

  1. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
public class ArrayDetail {
	//编写一个main函数
	public static void main(String[] args) {	
		//2. 数组中的元素可以是任意数据类型,包括基本类型和引用类型,但是不能混用
		String arr3[] = {"北京", "jack", "milan"};//引用类型
	}
}
  1. 数组创建后,如果没有赋值,有默认值:int - 0;short - 0;byte - 0;long - 0;float - 0.0;double - 0.0;char \u0000;boolean false;String null
public class ArrayDetail {
	//编写一个main函数
	public static void main(String[] args) {	
		//3. 数组创建后,如果没有赋值,会有默认值
		//int 0,short 0,byte 0,long 0,float 0.0,double 0.0,char \u0000
		//boolean false,String null
		
		short arr4[] = new short[3];
		System.out.println("====数组4====");
		for (int i = 0; i < arr4.length; i++) {
			System.out.println(arr4[i]);
		}
	}
}

img

  1. 使用数组的步骤:
    a)声明数组并开辟空间
    b) 给数组各个元素赋值
    c) 使用数组

  2. 数组的下标是从0开始的

  3. 数组下标必须在指定范围内使用,否则报错:下标越界异常,比如:int arr[] = new int[5];则有效的下标为 0-4

public class ArrayDetail {
	//编写一个main函数
	public static void main(String[] args) {	
		//6. 数组下标必须指定范围内使用,否则报错:下标越界异常
		//比如:int arr[] = new int[5]; 则有效下标为 0-4
		//即数组的下标/索引 最小为0 最大为数组长度-1
		int arr5[] = new int[5];
		System.out.println(arr5[5]);//数组越界
	}
}

img

  1. 数组属引用类型,数组型数据是对象(object)

数组应用案例

public class ArrayExercise01 {
	//编写一个main函数
	public static void main(String[] args) {
		//1. 创建一个char类型的26个元素的数组,分别放置'A'-'Z'
		//使用for循环访问所有元素并打印出来
		//提示:char类型数据运算 'A' + 1 -> 'B'
		//
		//思路分析
		//1. 定义一个 数组 char[] chars = new char[26];
		//2. 因为'A' + 1 = 'B' 类推,所有使用for来赋值
		//3. 使用for循环访问所有元素
		char chars[] = new char[26];
		for (int i = 0; i < chars.length; i++) {//循环26次
			chars[i] = (char)('A' + i);//由于得到的是int类型,因此需要强转成char类型
			System.out.print(chars[i] + " ");
		}
	}
}

img

public class ArrayExercise02 {
	//编写一个main函数
	public static void main(String[] args) {
		//2. 请求出一个数组int[]的最大值 {4, -1, 9, 10, 23} 并得到对应的下标
		//思路分析
		//1. 先定义一个int数组
		//2. 假定一个最大值为max = arr[0]
		//3. 然后遍历比较
		
		int arr[] = {4, -1, 9, 10, 23};
		int max = arr[0];
		int maxIndex = 0;//得到对应下标,定义存储下标
		for (int i = 1; i < arr.length; i++) {
			if (max < arr[i]) {
				max = arr[i];
				maxIndex = i;
			}
		}
		System.out.println("最大值=" + max);
		System.out.println("对应的下标=" + maxIndex);
	}
}

img

数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响

int n1 = 2; int n2 = n1;

  1. 数组在默认情况下是引用传递,赋的值是****地址

int arr1[] = {1, 2, 3};

int arr2[] = arr1;

  • 注意:当arr2指向arr1的地址的时候,arr2原先如果开辟出了一块空间,则那块空间会废弃,被销毁

img

数组拷贝

public class ArrayCopy {
	//编写一个main函数
	public static void main(String[] args) {
		//编写代码 实现数组拷贝(内容复制)
		//将int arr1[] = {10, 20, 30};拷贝到 arr2数组
		//要求:数据空间是独立的
		//思路:
		//创建一个新的数组arr2,开辟一个新的数据空间
		//大小跟 arr1.length 相同
		
		int arr1[] = {10, 20, 30};
		int arr2[] = new int[arr1.length];
		//遍历arr1,把每个元素拷贝到arr2对应的元素位置
		for (int i = 0; i < arr1.length; i++) {
			arr2[i] = arr1[i];
		}
		//输出arr1
		System.out.println("===arr1的值===");
		for (int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i]);
		}
		//修改arr2的值
		arr2[0] = 100;
		System.out.println("===arr2的值===");
		for (int i = 0; i < arr2.length; i++) {
			System.out.println(arr2[i]);
		}
	}
}

img

数组反转

public class ArrayReverse {
	//编写一个main函数
	public static void main(String[] args) {
		//需求:把数组的元素内容翻转
		//arr {11,22,33,44,55,66} -> {66,55,44,33,22,11}
		//思路
		//规律:
		//1. 把arr[0] 和 arr[5] 进行交换 {66,22,33,44,55,11}
		//2. 把arr[1] 和 arr[4] 进行交换 {66,55,33,44,22,11}
		//3. 把arr[2] 和 arr[3] 进行交换 {66,55,44,33,22,11}
		//4. 一共要交换 3 次 = arr.length / 2
		//5. 每次交换时,对应的下标是 arr[i] 和 arr[arr.length - 1 - i]
		//
		//优化
        //老师的写法:
		int arr[] = {11, 22, 33, 44, 55, 66};
		int temp = 0;
		int len = arr.length;
		for (int i = 0; i < len / 2; i++) {
			temp = arr[len - 1 - i];//保存
			arr[len - 1 - i] = arr[i];
			arr[i] = temp; 
		}
		//打印
		System.out.println("===翻转后数组===");
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}

		//自己的写法,将其倒着传给另一个数组
		//然后再赋给原先的数组 可以直接指向arr2 即 arr = arr2
		int arr[] = {11, 22, 33, 44, 55, 66};
		int arr2[] = new int[arr.length];
		for (int i = arr.length - 1; i >= 0; i--) {
			//可以增加一个循环变量 j -> 0 -> 5
			arr2[arr.length - 1 - i] = arr[i];
		}
		//让arr 指向arr2 的数据空间,此时 arr 原来的数据空间就没有变量引用,会被当作垃圾,销毁
		arr = arr2;
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
} 

img

数组添加/扩容

import java.util.Scanner;
public class ArrayAdd {
	//编写一个main函数
	public static void main(String[] args) {
		//要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java 
		//1) 原始数组使用静态分配 int[] arr = {1,2,3} 
		//2) 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4} 
		
		//思路分析
		//1. 定义初始数组 int arr[] = {1,2,3};
		//2. arr[3] = 4;//error 由于原先的下标最大为2,这样就会显示下标越界
		//3. 定义一个新的数组 int arrNew = new int[arr.length+1];
		//4. 遍历arr 数组,依次将arr的元素拷贝到 arrNew 数组
		//5. 将 4 赋给 arrNew[arrNew.length - 1] = 4;//把4赋给 arrNew 的最后一个元素
		//6. 让arr 指向 arrNew ,那么原来的arr数组就会被销毁

		int arr[] = {1, 2, 3};
		int arrNew[] = new int[arr.length + 1]; 
		for (int i = 0; i < arr.length; i++) {
			arrNew[i] = arr[i];
		}
		//把4赋给arrNew的最后一个元素
		arrNew[arrNew.length - 1] = 4;
		//让 arr 指向 arrNew
		arr = arrNew;
		//输出arr 看看效果
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
	}
} 

img

import java.util.Scanner;
public class ArrayAdd02 {
	//编写一个main函数
	public static void main(String[] args) {
		//要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java 
		//1) 原始数组使用静态分配 int[] arr = {1,2,3} 
		//2) 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4} 
		
		//3) 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
		
		//思路分析
		//1. 定义初始数组 int arr[] = {1,2,3};
		//2. arr[3] = 4;//error 由于原先的下标最大为2,这样就会显示下标越界
		//3. 定义一个新的数组 int arrNew = new int[arr.length+1];
		//4. 遍历arr 数组,依次将arr的元素拷贝到 arrNew 数组
		//5. 将 4 赋给 arrNew[arrNew.length - 1] = 4;//把4赋给 arrNew 的最后一个元素
		//6. 让arr 指向 arrNew ,那么原来的arr数组就会被销毁
		//7. 创建一个 Scanner 可以接受用户输入
		//8. 因为用户什么时候退出,不确定,使用do-while + break 来控制
		Scanner myScanner = new Scanner(System.in);
		
		int arr[] = {1, 2, 3};
		do {
			int arrNew[] = new int[arr.length + 1]; 
			for (int i = 0; i < arr.length; i++) {
				arrNew[i] = arr[i];
			}
			System.out.println("请输入你要添加的元素(int类型)");
			int addNum = myScanner.nextInt();
			//把addNum赋给arrNew的最后一个元素
			arrNew[arrNew.length - 1] = addNum;
			//让 arr 指向 arrNew
			arr = arrNew;
			//输出arr 看看效果
			for (int i = 0; i < arr.length; i++) {
				System.out.print(arr[i] + "\t");
			}
			//问用户是否继续
			System.out.println("是否继续添加:y/n");
			char key = myScanner.next().charAt(0);
			if (key == 'n') {//如果输入n,就结束
				break;
			} 
		} while (true);
		System.out.println("你退出了添加...");
	}
} 

img

排序

基本介绍

  • 排序是将多个数据,依指定的顺序进行排列的过程

排序的分类:

  1. 内部排序
  • 指将需要处理的所有数据都加载到内部存储器中进行排序,包括(交换式排序法、选择式排序法和插入式排序法)
  1. 外部排序法
  • 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,包括(合并排序法和直接合并排序法)

冒泡排序法

  • 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒

img

public class BubbleSort {
	//编写一个main函数
	public static void main(String[] args) {
		//冒泡排序 - 升序
		//化繁为简,先死后活
		/*
			数组 [24,69,80,57,13] 
			第 1 轮排序: 目标把最大数放在最后 
			第 1 次比较[24,69,80,57,13] 
			第 2 次比较[24,69,80,57,13] 
			第 3 次比较[24,69,57,80,13] 
			第 4 次比较[24,69,57,13,80]
		 */
		int arr[] = {24, 69, 80, 57, 13};
		for (int j = 1; j < arr.length; j++) {
			for (int i = 0; i < arr.length - j; i++) {
				if (arr[i] > arr[i+1]) {
					int temp = arr[i];
					arr[i] = arr[i+1];
					arr[i+1] = temp;
				}
			}
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
} 

img

查找

  • 在java中,我们常用的查找有两种
  1. 顺序查找
  2. 二分查找
import java.util.Scanner;
public class SeqSearch {
	//编写一个main函数
	public static void main(String[] args) {
		//) 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
		//从键盘中任意输入一个名称,判断数列中是否 包含此名称【顺序查找】 
		//要求: 如果找到了,就提示找到,并给出下标值
		
		//思路分析
		//1. 定义一个字符串数组
		//2. 接受数组输入,遍历数组,逐一比较,如果发现有,则提示信息,并退出
		String names[] = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
		Scanner myScanner = new Scanner(System.in);
		System.out.println("请输入名字");
		String findName = myScanner.next();

		//遍历数组,逐一比较
		//
		int index = -1;
		for (int i = 0; i < names.length; i++) {
			if (findName.equals(names[i])) {
				System.out.println("恭喜你找到 " + findName);
				System.out.println("下标为 " + i);
				//把i保存到index
				index = i;
				break;//退出
			} 
		}
		if (index == -1) {
			System.out.println("没有找到");
		}
	}
}

img

多维数组-二维数组

二维数组的使用

public class TwoDimensionalArray01 {
	//编写一个main函数
	public static void main(String[] args) {
		//请用二维数组输出如下图形 
		//0 0 0 0 0 0 
		//0 0 1 0 0 0 
		//0 2 0 3 0 0 
		//0 0 0 0 0 0
		
		//二维数组:
		//1. 从定义形式上看 int[][]
		//2. 原来的一维数组的每个元素是一维数组,就构成了二维数组
		int arr[][] = {{0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0}, 
						{0, 2, 0, 3, 0, 0}, {0, 0, 0, 0, 0, 0}};
		//关于二维数组的关键概念
		//(1)
		System.out.println("二维数组的元素个数=" + arr.length);
		//(2)二维数组的每个元素是一维数组,所以如果需要得到每个一维数组的值
		//	 还需要再次遍历
		//(3)如果我们要访问第(i+1)个一维数组的第(j+1)个值,arr[i][j]
		//	 举例:访问3 - arr[2][3]
		System.out.println(arr[2][3]);

		//输出二维图形
		for (int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
			//遍历二维数组的每个元素(数组)
			//arr[i] 表示二维数组的第 i+1 个元素,比如 arr[0]:二维数组的第一个元素
			//arr[i].length 得到对应的每个一位数组的长度
			for (int j = 0; j < arr[i].length; j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
	}
} 

img

使用方式1:动态初始化

语法:类型[][] 数组名 = new 类型[大小][大小]

比如:int a[][] = new int[2][3];

public class TwoDimensionalArray02 {
	//编写一个main函数
	public static void main(String[] args) {
		//1. 
		int arr[][] = new int[2][3];
        
		arr[1][1] = 8;
		//遍历arr数组
		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();
		}
	}
} 
  • 二维数组在内存中的存在形式

img

使用方式2:动态初始化

先声明:类型 数组名[][];

再定义(开辟空间):数组名 = new 类型[大小][大小]

赋值(有默认值,比如 int 类型就是0)

public class TwoDimensionalArray02 {
	//编写一个main函数
	public static void main(String[] args) {
		//2. 
		//int arr[][];//声明二维数组
		//arr = new int[2][3];//再开辟空间

		arr[1][1] = 8;
		//遍历arr数组
		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();
		}
	}
} 
使用方式3:动态初始化-列数不确定

img

public class TwoDimensionalArray03 {
	//编写一个main函数
	public static void main(String[] args) {
		
		//需求:动态创建一个二维数组
		//一共有三个一维数组,每个一维数组的元素是不一样的
		
		int arr[][] = new int[3][];//不确定列数就不写 ,创建 二维数组,但是只是确定了一维数组的个数
		//每个一维数组还没有开数据空间
		for (int i = 0; i < arr.length; i++) {//遍历arr每个一维数组
			//给每个一维数组开空间 new
			//如果没有给一维数组 new ,那么arr[i] 就是 null
			arr[i] = new int[i + 1];

			//遍历一维数组,并给一维数组的每个元素赋值
			for (int j = 0; j < arr[i].length; j++) {
				arr[i][j] = i + 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();
		}
		
	}
} 

img

使用方式4:静态初始化

定义 类型 数组名[][] = {{值1, 值2…}, {值1, 值2…}, {值1, 值2…}};

比如:int[][] arr = {{1, 1, 1}, {8, 8, 9}, {100}};

解读:

  1. 定义了一个二维数组arr
  2. arr有三个元素(每个元素都是一维数组)
  3. 第一个一维数组有3个元素,第二个一维数组有3个元素,第三个一维数组有1个元素
public class TwoDimensionalArray04 {
	//编写一个main函数
	public static void main(String[] args) {
		
		int arr[][] = {{1,1,1}, {0,0,0}, {100}};
		
	}
} 

二维数组的应用案例

  • int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和
public class TwoDimensionalArray05 {
	//编写一个main函数
	public static void main(String[] args) {
		//需求:int arr[][] = {{4,6}, {1,4,5,7}, {-2}}; 
		//遍历该二维数组,并得到和
		
		int sum = 0;
		int arr[][] = {{4,6}, {1,4,5,7}, {-2}};
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				sum += arr[i][j];
			}
		}
		System.out.println(sum);
	}
} 
  • 使用二维数组打印一个 10 行杨辉三角 YangHui.java

img

public class YangHui {
	//编写一个main函数
	public static void main(String[] args) {
		//使用二维数组打印一个10行的杨辉三角
		//规律
		//1. 第一行有 1 个元素, 第 n 行有 n 个元素 
		//2. 每一行的第一个元素和最后一个元素都是 1 
		//3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值. 
		//arr[i][j] arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; //必须找到这个规律

		int arr[][] = new int[10][];
		for (int i = 0; i < arr.length; i++) {//遍历arr的每个元素
			//给每个一维数组(行)开辟空间
			arr[i] = new int[i + 1];
			//给每个一维数组赋值
			for (int j = 0; j < arr[i].length; j++) {
				if (j == 0 || j == arr[i].length - 1) {
					arr[i][j] = 1;
				} else {//中间的元素
					arr[i][j] = arr[i-1][j] + arr[i-1][j-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();
		}	
	}
} 

img

二维数组使用细节和注意事项

  1. 一维数组的声明方式有:

int[] x 或者 int x[]

  1. 二维数组的声明方式有:

int[][] y 或者 int[] y[] 或者 int y[][]

  1. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同

比如:int map[][] = {{1, 2}, {3, 4, 5}};

由 map[0] 是一个含有两个元素的一维数组,map[1] 是一个含有三个元素的一维数组构成,我们也成为列数不等的二维数组

二维数组课堂练习

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzzan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值