栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java学习笔记-二维数组

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java学习笔记-二维数组

目录
  • 一、冒泡排序原理
  • 二、冒泡排序实现
  • 三、认识Arrays类
  • 四、Arrays类的应用
  • 五、认识二维数组
  • 六、使用二维数组


一、冒泡排序原理

案例:将5个人从矮到高排队(小绿、小红、小黄、小蓝、小黑)

原理:从前往后,依次两两比较,前者比后者大就交换位置,否则不交换

第一轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小黄比,小红比小黄矮,符合排队规则,不交换位置
第三步:小黄与小蓝比,小黄比小蓝高,不符合排队规则,两个交换位置

第四步:小黄与小黑比,小黄比小黑高,不符合排队规则,两个交换位置

至此,第一轮遍历结束,共比较四次,最大的小黄冒出水面;因此第二轮比较小黄就不参与排队了

第二轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小蓝比,小红比小蓝矮,符合排队规则,不交换位置
第三步:小蓝与小黑比,小蓝比小黑高,不符合排队规则,两个交换位置

至此,第二轮遍历结束,共比较三次,最大的小蓝也冒出水面了,不参与下一轮的比较

第三轮:
第一步:小绿与小红比,小绿比小红矮,符合排队规则,不交换位置
第二步:小红与小黑比,小红比小黑高,不符合排队规则,交换位置

至此,第三轮遍历结束,共比较两次,最大的小红也冒出水面了,不参与下一轮的比较

第四轮:
第一步:小绿与小黑比,小绿比小黑高,不符合排队规则,两个交换位置

至此,所有排序结束,第四轮共比较一次,小绿冒出,顺序排列完成。

每一轮都有一个最大的数冒出,因此形象的称这个算法为冒泡排序;


二、冒泡排序实现

分析:
第一轮:比较4次;
第二轮:比较3次;
第三轮:比较2次;
第四轮:比较1次;
轮数在循环,比较次数也在循环,自然想到双重循环;那么哪个作外层循环?哪个作内层循环呢?想到之前讲到的地球公转与自转的例子,明显轮作外层循环,比较次数作内层循环比较合适;因为一轮要比较多次。
用双重循环将5个数字升序排序:
①5个数字如何存放?用数组存放,数组.length = 5
②控制比较多少轮?外层循环,循环变量i(5个数比较4轮,6个数比较5轮,n个数比较(n-1)轮)
③控制每轮比较多少次?内存循环,循环变量j(i从0开始,i=0,j=4;i=1,j=3…故j = 4 - i,推广到n个数就是j = n-1-i)
④交换数据

public class SortNums{
	public static void main(String[] args){
		int[] nums = {16,25,9,90,23};
		System.out.println("*******冒泡排序前*******");
		for(int num : nums){
			System.out.print(num + "t");
		}
		
		//冒泡排序
		for(int i = 0;i < nums.length-1;i++){
			for(int j = 0;j < nums.length-1-i;j++){
				//比较并交换数字
				if(nums[j] > nums[j+1]){	//按升序排列
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
			}
		}
		
		System.out.println("n*******冒泡排序后******");
		for(int num : nums){
			System.out.print(num + "t");
		}
	}
}

思考:如何手动输入数据,并进行排序?如何进行降序排列?

import java.util.Scanner;

public class SortNums{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("请依次输入五个数字:");
		int[] nums = new int[5];
		for(int i = 0;i < nums.length;i++){
			nums[i] = input.nextInt();
		}
		
		System.out.println("*******冒泡排序前*******");
		for(int num : nums){
			System.out.print(num + "t");
		}
		
		//冒泡排序
		for(int i = 0;i < nums.length-1;i++){
			for(int j = 0;j < nums.length-1-i;j++){
				//比较并交换数字
				if(nums[j] < nums[j+1]){	//按降序排列
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
			}
		}
		
		System.out.println("n*******冒泡排序后******");
		for(int num : nums){
			System.out.print(num + "t");
		}
	}
}

三、认识Arrays类

Arrays使用java.util.Arrays类:
(1)java.util包提供的工具类
(2)Arrays类提供操作数组的方法,如排序、查询
(3)Arrays类的sort()方法:对数组进行升序排列

例1:获取5名学员的成绩,并使用Arrays类对其排序;

import java.util.Arrays;
import java.util.Scanner;

public class SortScoreByArrays{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("请依次输入五个数字:");
		int[] nums = new int[5];
		for(int i = 0;i < nums.length;i++){
			nums[i] = input.nextInt();
		}
		
		System.out.println("*******Arrays排序前*******");
		for(int num : nums){
			System.out.print(num + "t");
		}
		
		//Arrays排序
		Arrays.sort(nums);
		
		System.out.println("n*******Arrays排序后******");
		for(int num : nums){
			System.out.print(num + "t");
		}
	}
}

使用Arrays的sort方法只需要一行代码就可以进行排序,但并不是说之前学过的排序算法就没有用,sort方法就是封装了排序算法,所以两者我们都要掌握!

sort方法是对数组升序排列,那如何降序排列呢?很简单,先使用sort方法使数组按升序排好,输出时倒着输出就可以了。


四、Arrays类的应用

1:Arrays类常用方法

接下来通过代码练习上述方法:

import java.util.Arrays;

public class ArraysMethods{
	public static void main(String[] args){
		//equals(array1,array2)的作用是:比较两个数组是否相等
		System.out.println("-------equals(array1,array2)方法--------");
		int[] arr1 = {10,50,40,30};
		int[] arr2 = {10,50,40,30};
		int[] arr3 = {60,50,85};
		System.out.println(Arrays.equals(arr1, arr2));
		System.out.println(Arrays.equals(arr1, arr3));
		
		//toString(array)的作用是:将一个数组array转换成字符串
		System.out.println("--------toString(array)方法-------------");
		int[] arr = {10,50,40,30};
		System.out.println(Arrays.toString(arr));
		
		//fill(array,val)的作用是:把数组array的所有元素都赋值为val
		System.out.println("--------fill(array,val)方法-------------");
		int[] arr4 = {10,50,40,30};
		Arrays.fill(arr4, 100);		//该方法没有返回值
		System.out.println(Arrays.toString(arr4));
		
		//copyOf(array,length)的作用是:把数组array复制成一个长度为length的新数组
		System.out.println("--------copyOf(array,length)方法--------");
		int[] arr5 = {10,50,40,30};
		int[] arr6 = Arrays.copyOf(arr5, 4);
		System.out.println(Arrays.toString(arr6));
		
		//binarySearch(array,val)的作用是:查询元素值val在数组array中的下标
		System.out.println("--------binarySearch(array,val)方法--------");
		int[] arr7 = {10,50,40,30};
		Arrays.sort(arr7);		//先将数组升序排列:10,30,40,50
		int index = Arrays.binarySearch(arr7, 40);
		System.out.println(index);
	}
}

2:Arrays类排列字符

使用Arrays类升序排列一组字符,并查找某个特殊字符在升序后数组中的位置;

import java.util.Arrays;

public class ArraysSortChar {
	public static void main(String[] args) {
		// 字符排序
		char[] chars = new char[] { 'a', 'c', 'u', 'b', 'e', 'p', 'f', 'z' };

		System.out.print("原字符序列:");
		for (char oldChar : chars) {
			System.out.print(oldChar + " ");
		}

		// 查找特定字符b的位置
		Arrays.sort(chars);		//按照字符的ASCII进行升序排列
		System.out.print("n排序后的字符序列:");
		for (char oldChar : chars) {
			System.out.print(oldChar + " ");
		}
		
		int index = Arrays.binarySearch(chars, 'b');
		System.out.println("ne字符b在数组中的位置是:" + index);
	}
}

Java中有很多方法,我们不可能都准确的记住他们是如何使用的,当我们需要使用某个方法时,我们可以查找JDK帮助文档,就像小学学语文时遇到不会的字就查字典一样,下面别人分享的JDK帮助文档中文版。
jdk帮助文档:https://blog.csdn.net/qq_40147863/article/details/83051268


五、认识二维数组

为什么要学习多维数组?

有这样一个需求:要求对5个班5名学生的某门课程的成绩进行各种操作,如何实现?

对于一维数组,我们可以对5名同学的成绩进行求和,求平均值等操作,可是现在有五个班,该如何实现呢?有人会想到可以定义一个长度为25的一维数组,可是这样又如何区分每个学生的成绩属于哪个班呢?显然不妥!亦或者可以定义5个长度为5的数组存储数据,这样当然也可以,只是太麻烦,要是有100个班呢?还得定义100个数组,显然也不妥!

我们可以使用二维数组解决这个问题,只需要使用一个数组就可以存储5个班的同学成绩。所谓二维数组就是多个一维数组拼成一个二维数组

<数据类型> [ ][ ] 数组名;或者 <数据类型> 数组名 [ ][ ]

int[][] scores;	//定义二维数组
scores = new int[5][50];	//分配内存空间:5个长度为50的一维数组拼成一个二维数组,二维数组长度为5
//或者
int[][] scores = new int[5][50];

定义二维数组时,要定义最大维数

int[][] scores = new int[5][];	//正确,二维数组长度为5,每个一维数组长度可以不定义
int[][] scores = new int[][];	//错误,没有定义二维数组的长度

总结:二维数组实际上就是一个以一维数组为元素的一维数组,一维数组元素是数据,而二维数组元素是一维数组;这里我想到了学习c语言的时候,谭浩强老师的教材是将二维数组比作按排按列排队,
比如a[3][5]就是3行5列的方队,其中二维数组长度就是有几排,每一排多少个人就是每一个一维数组的长度。


六、使用二维数组

如何定义并赋值?
写法一:int[ ][ ] scores = new int[ ][ ]{{90,85,92,78,54},{76,63,80},{87}};
写法二:int scores[ ][ ] = {{90,85,92,78,54},{76,63,80},{87}};

例2:5个班各5名学生的某门课程的成绩,如何计算5个班各自的总成绩

import java.util.Scanner;

public class ClassScoreTotal{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		int[][] scores = new int[5][5];
		
		//为班级同学成绩赋值
		for(int i = 0;i < scores.length;i++){
			System.out.println("------第"+(i+1)+"个班-------");
			for(int j = 0;j < scores[i].length;j++){
				scores[i][j] = input.nextInt();
			}
		}
		
		//完成5个班级的成绩统计
		System.out.println("---------统计成绩----------");
		for(int i = 0;i < scores.length;i++){
			int sum = 0;
			for(int j = 0;j < scores[i].length;j++){
				sum += scores[i][j];
			}
			System.out.println("第"+(i+1)+"个班的同学的总成绩为:"+sum);
		}
	}
}

二维数组经常结合双重循环使用


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号