zoukankan      html  css  js  c++  java
  • Arrays工具类、二维数组

    Arrays工具类、二维数组

    回顾

    1.Idea的使用
    
    
    2.数组的声明初始化方式
    		声明
    		int[] arr; 
    		int arr[];//不推荐使用
    		初始化
    		2.1静态初始化
    		  arr=new int[]{10,20,30};
    		  int[] arr2=new int[]{3,4,5};
    		  //简写 必须一条语句完成
    		  int[] arr3={1,3,5};
    		2.2动态初始化
               int[] arr4=new int[4];//创建数组,长度4,数组元素都是默认值 0
    		  String[] arr5=new String[5];  //创建数组,长度5,数组元素都是默认值null
    		  
    3.数组的使用(元素访问,元素修改,遍历)
    	      3.1 访问元素  使用下标 ,下标范围 0 - 长度-1
    	      3.2 获取长度  arr.length;
    	      3.3 修改元素  
    	          arr[0]=10;
    	          arr[1]=20;
    	          arr[2]=30;
    	      3.4 数组遍历
    	      	//for
    	      	 for(int i=0;i<arr.length;i++){
                   		System.out.println(arr[i]);
    	      	 }
    	      	 //增强for  ,缺点不能访问下标
    	      	 for(int num:arr){
                         System.out.println(num);
    	      	 }
    	      	 注意:1 数组不要越界   ArrayIndexOutofBoundsException
    	      	 	  2 数组一定要初始化  NullPointerException
    	      3.5数组内存空间的分配
              	栈:存储基本类型数据和引用类型的地址 ,特点:先进后出  空间比较小,访问速度较快
              	堆:存储引用类型的实际数据,特点:空间比较大,访问速度较慢
              	
              	int[] nums=new int[]{20,30,40};
              	
              	nums 数组 栈 地址
              	{20,30,40}存放在堆中
    	      	 
    4.数组的应用(排序和查找)
    	 排序:
    	 	4.1 冒泡排序
    	 		N个数字来排列
    	 		两两比较小靠前
    	 		外层循环n-1
    	 		内层循环n-1-i
    	 		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;
                      	}
                  	}
    	 		}
    	 	4.2 选择排序
    	 		N个数字来排列
    	 		选择一个来比较
    	 		外层循环n-1
    	 		内层循环小于n
    	 		
    	 		for(int i=0;i<nums.length-1;i++){
                  	for(int j=i+1;j<nums.length;j++){
                       if(nums[i]>nums[j]){
                         int temp=nums[i];
                         nums[i]=nums[j];
                         nums[j]=temp;
                       }
                  	}
    	 		}
    	 		
    	 		优化
    	 		
    	 		for(int i=0;i<nums.length-1;i++){
    	 		   int k=i;
                  	for(int j=i+1;j<nums.length;j++){
                       if(nums[k]>nums[j]){
                       	  k=j; //最小的数的下标
                       }
                  	}
                  	if(k!=i){
                       int temp=nums[k];
                       nums[k]=nums[i];
                       nums[i]=temp;
                  	}
    	 		}
    	 		
    	 	
    	 查找:
         	4.3 顺序查找
         		
         	4.4 二分法查找
         	
         		1 先排序
         		2 每次从中间开始,进行比较
         		
         		int low=0;
         		int upper=nums.length-1;
         		
         		while(low<=upper){
                   int middle=(low+upper)>>1;
                   if(nums[middle]>key){
                      upper=middle-1;
                   }else if(nums[middle]<key){
                      low=middle+1;
                   }else{
                      return middle;
                   }
         		}
         		return -1;
         		
    

    今天内容

    1.Arrays工具类
    2.方法传参和返回值
    3.可变参数
    4.二维数组
     1.1 二维数组的概念
     1.2 二维数组的定义
     1.3 数组的初始化
     1.4 二维数组的访问
    5.调试和文档注释 
    

    教学目标

    1.掌握Arrays工具类的使用
    2.掌握方法传参和返回值
    3.掌握可变参数的使用
    4.掌握二维数组的初始化和遍历
    5.掌握调试和文档注释
    

    第一节 Arrays工具类

    使用帮助文档:
     1.6
     1.8  
    
    作用:主要用于对数组进行排序,查找,填充,比较等的操作
    Arrays工具类存在于java.util包下,所以使用的第一步就是导包:import java.util.Arrays;
    
    注意1:如果在同一个Java文件中同时使用Scanner和Arrays,则可以向如下方式导包:
    	  import java.util.Scanner;
          import java.util.Arrays;
    
    	  或者简写为:* 所有的类
          import java.util.*;
    
    注意2:但凡是工具类,类中的方法全部是静态的,方便调用
    	  调用语法:类名.方法名(实参列表)
    

    代码实现:

    //演示Arrays工具类的使用
    package com.qf.day07;
    
    import java.util.Arrays;
    
    /*
     * Arrays工具类的使用
     * 1 二分查找
     * 2 排序
     * 3 复制
     * 4 填充 
     * 5 把数组转成字符串
     *
     * 
     */
    
    public class Demo1 {
    	public static void main(String[] args) {
    	//	binarySearch();
    		//sort();
    		//copy();
    		//fill();
    		toStr();
    	}
    	//binarySearch 二分查找
    	public static void binarySearch() {
    		int[] arr=new int[] {5,8,10,20,65,100};	
    		int result=Arrays.binarySearch(arr,22);
    		if(result>=0) {
    			System.out.println("找到了");
    		}else {
    			System.out.println("没找到 ");
    		}
    	}
    	//排序
    	public static void sort() {
    		int[] arr=new int[] {12,8,100,2,9};
    		Arrays.sort(arr);
    		System.out.println("排序之后:");
    		for(int i=0;i<arr.length;i++) {
    			System.out.print(arr[i]+" ");	
    		}	
    	}
    	//复制
    	public static void copy() {
    		int[] arr=new int[] {12,8,100,2,9};
    		int[] arr2=Arrays.copyOf(arr, arr.length);
    		for(int i=0;i<arr2.length;i++) {
    			System.out.println(arr2[i]);
    		}
    	}
    	//填充
    	public static void fill() {
    		int[] arr=new int[] {12,8,100,2,9};
    		Arrays.fill(arr, 10);
    		for(int i=0;i<arr.length;i++) {
    			System.out.println(arr[i]);
    		}
    	}
    	//把数组转成字符串
    	public static void toStr() {
    		int[] arr=new int[] {12,8,100,2,9};
    		String s=Arrays.toString(arr);
    		System.out.println(s);
    	}
    	
    }
    

    第二节 方法的传参和返回值

    根据有没有参数:(1)无参方法 (2)有参方法

    根据有没有返回值:(1)无返回值 (2)有返回值

    2.1 基本类型作为方法的参数

    ​ 案例1:交换两个数字

    public class Demo2 {
    	public static void main(String[] args) {
    		int num1=10;
    		int num2=20;
    		swap(num1, num2);
    		System.out.println(num1);
    		System.out.println(num2);
    	}
    	public static void swap(int a,int b) {
    		System.out.println("交换之前: a:"+a+" b:"+b);
    		int temp=a;
    		a=b;
    		b=temp;
    		System.out.println("交换之后: a:"+a+" b:"+b);
    	}
    }
    

    2.2 引用类型作为方法的参数

    ​ 案例2:实现数组排序

    import java.util.Arrays;
    
    /*
     * 方法的参数传递和返回值
     * 1 交换两个数字
     * 2 实现数组排序
     * 
     */
    public class Demo2 {
    	public static void main(String[] args) {
    		int[] nums=new int[] {15,8,3,9,20,50};
    		sort(nums);
    		//遍历nums
    		System.out.println("遍历nums");
    		for(int i=0;i<nums.length;i++) {
    			System.out.print(nums[i]+" ");
    		}
    	}
    	
    	//2实现数组排序
    	public static void sort(int[] arr) {
    		//排序之前
    		System.out.println("排序之前");
    		System.out.println(Arrays.toString(arr));
    		//冒泡
    		for(int i=0;i<arr.length-1;i++) {
    			for(int j=0;j<arr.length-i-1;j++) {
    				if(arr[j]>arr[j+1]) {
    					int temp=arr[j];
    					arr[j]=arr[j+1];
    					arr[j+1]=temp;
    				}
    			}
    		}
    		//排序之后
    		System.out.println("排序之后");
    		System.out.println(Arrays.toString(arr));
    		
    	}
    	
    }
    

    总结: Java中的方法传参采用的是传值的方式。

    ​ 1 基本类型传递的实际数据

    ​ 2 引用类型传递的是地址

    基本类型传递修改后对调用方没有任何影响。引用类型传递修改后对调用方有影响。String和包装类除外

    2.3 基本类型作为方法返回值

    案例3 编写一个方法,实现1-100和,并返回结果

    public class Demo3 {
    
    	public static void main(String[] args) {
    		int result=sum();
    		System.out.println(result);
    	}
    	
    	public static int sum() {
    		//计算1-100的和
    		int sum=0;
    		for(int i=0;i<=100;i++) {
    			sum+=i;
    		}
    		return sum;
    	}
    }
    

    2.4 引用类型作为方法返回值

    案例4 : 编写一个方法,返回一个数组

    package com.qf.day07;
    
    import java.util.Arrays;
    
    /*
     * 方法返回值
     * 1 基本类型作为方法返回值
     * 2 引用类型作为方法返回值
     */
    public class Demo3 {
    
    	public static void main(String[] args) {
    		int[] nums2=getNums();
    		for(int i=0;i<nums2.length;i++) {
    			System.out.println(nums2[i]);
    		}
    	}
    
    	//把数组中的每个数字加5,再返回一个数组
    	public static int[] getNums() {
    		int[] arr=new int[] {5,10,15};
    		for(int i=0;i<arr.length;i++) {
    			arr[i]=arr[i]+5;
    		}
    		return arr;
    	}
    }
    

    总结:方法的返回值如果是基本类型则返回实际数据,如果是引用类型则返回地址。

    特殊:String类型和包装类传值方法和返回值遵循基本类型。

    第三节 可变参数

    不定长参数

    在调用方法时,方法的形参的个数是不确定的
    语法
    类型... 变量名称
    例如:int... num
    
    好处:不用创建数组,直接写数组元素
    

    代码实现:

    package com.qf.day07;
    /*
     * 可变参数
     * int...
     * 好处:不用创建数组,直接写数组元素
     * 注意事项:
     * 1 一个方法只能有一个可变参数
     * 2 可变参数只能方法参数列表最后
     */
    public class Demo4 {
    	public static void main(String[] args) {
    		//调用
    		//int[] nums= {10,4,8,20};
    		//sort(nums);
    		sort(10,4,8,20,1,2); //实际运行是,把这些数据变成数组
    		
    	}
    	public static void sort(int a,int... arr) {
    		for(int i=0;i<arr.length-1;i++) {
    			for(int j=0;j<arr.length-i-1;j++) {
    				if(arr[j]>arr[j+1]) {
    					int temp=arr[j];
    					arr[j]=arr[j+1];
    					arr[j+1]=temp;
    				}
    			}
    		}
    	}
    }
    

    注意:
    a.不定长的参数在进行使用的时候被当做数组来进行处理

    b.一个方法只能有一个可变参数

    c. 可变参数只能方法参数列表最后

    第四节 二维数组

    4.1 二维数组的概念
    本质上还是一个一维数组,只是其数组元素又是一个一维数组
    	
    	举例说明:变量,一维数组,二维数组之间的关系
    	吸烟:
    	没钱 	 	1根		 一个变量
    	稍微有钱  一包	   一维数组【20根】	
    	有钱	    一条		二维数组【10包】
    
    4.2 二维数组的定义
    	方式一:元素类型[][] 数组名称;
    
    	方式二:元素类型 数组名称[][];
    	推荐使用方式一
    
    4.3 数组的初始化
    	静态初始化:
    
    	语法:元素类型[][] 数组名称 = new 元素类型[][]{{一维数组1,一维数组2,一维数组3....};
    	简化:元素类型[][] 数组名称 =m{{一维数组1,一维数组2,一维数组3....};
    
    	举例:int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};
    	      int[][] arr = {{2,3},{5,2,1},{10,45,22,54}};
    
    	动态初始化:
    
    	语法:元素类型[][] 数组名称 = new 元素类型[二维数组的长度][一维数组的长度]
    	举例:int[][] arr = new int[3][4];
    	说明:定义一个数组arr,二维数组中一维数组的个数为3个,每个一维数组中元素的个数为4个
    
    4.4 二维数组的访问

    通过下标访问二维的指定元素

    class TwiceArrayDemo01 
    {
    	public static void main(String[] args) 
    	{
    		int[][] arr = new int[3][4];
    
    		System.out.println(arr);//[[I@15db9742
    		System.out.println(arr.length);//3
    		System.out.println(arr[0]);//[I@6d06d69c
    		System.out.println(arr[0].length);//4
    		System.out.println(Arrays.toString(arr));//[[I@6d06d69c, [I@7852e922, [I@4e25154f]
    		System.out.println(Arrays.toString(arr[0]));//[0, 0, 0, 0]
    
    		/*
    		[[I@15db9742
    		3
    		[I@6d06d69c
    		4
    		[[I@6d06d69c, [I@7852e922, [I@4e25154f]
    		[0, 0, 0, 0]
    		*/
    	}
    }
    

    遍历二维数组

    //常见的操作:遍历二维数组
    class TwiceArrayDemo02 
    {
    	public static void main(String[] args) 
    	{
    		//如果二维数组中一维数组的元素个数不确定
    		//int[][] arr = new int[3][];
    
    		int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};
    
    		//给arr[0]中的第0个元素修改值
    		arr[0][0] = 10;
    
    		//遍历arr[0]
    		for(int i = 0;i < arr[0].length;i++) {
    			System.out.println(arr[0][i]);
    		}
    
    		//二维数组的遍历:嵌套for循环
    		//简单for循环
    		for(int i = 0;i < arr.length;i++) {
    			int[] subArr = arr[i];
    			for(int j = 0;j < subArr.length;j++) {
    				System.out.println(subArr[j]);
    			}
    		}
    
    		//增强for循环
    		for(int[] subArr1:arr) {
    			for(int n:subArr1) {
    				System.out.println(n);
    			}
    		}
    	}
    }
    

    上机练习:一个班级有两门课程,5个学生,使用二维数组保存每门课的成绩,并计算每门课的总分和平均分

    public static void main(String[] args) {
    		double[][] scores=new double[2][5];
    		Scanner input=new Scanner(System.in);
    		for(int i=0;i<scores.length;i++) {
    			for(int j=0;j<scores[i].length;j++) {
    				System.out.println("请输入第"+(i+1)+"门课,第"+(j+1)+"个学生的成绩");
    				scores[i][j]=input.nextDouble();
    			}
    		}
    		System.out.println("----------------------------");
    		for(int i=0;i<scores.length;i++) {
    			double sum=0;
    			for(int j=0;j<scores[i].length;j++) {
    				sum+=scores[i][j];
    			}
    			System.out.println("第"+(i+1)+"门课的总分是:"+sum);
    			System.out.println("第"+(i+1)+"门课的平均分是:"+(sum/5));
    			
    		}
    	}
    
    4.5 内存中的二维数组
    public static void main(String[] args) {
            int[][] nums={{10,20,30},{40,50,60}};
            int[][] nums2={{1,2},{3,4},{5,6}};
            int[][] nums3=new int[3][2];
            int[][] nums4=new int[2][];
     }
    

    画图分析:

    内存中的二维数组

    第五节:调试技巧

    使用调试技巧,帮助开发人员理解程序执行过程,从而发现问题,解决问题。

    使用eclipse调试程序需要两个步骤:

    • 1添加断点:

    • 2单步执行:

      快捷键: F5单步进入 Step Into

      ​ F6单步跳过 Step Over

      ​ F7单步返回 Step Return

      ​ F8继续执行 Resume

      查看变量窗口、断点窗口

    使用Idea调试程序,同样需要两个步骤:

    • 1添加断点:

    • 2单步执行:

      * 快捷键
      * F8  step over  单步跳过
      * F7  step into  单步进入
      * Alt+Shift + F7 强制单步进入,进入其他的类库
      

    第六节:文档注释

    java中注释

    • 单行注释://这里是单行注释
    • 多行注释:/*这里是多行注释,

    ​ 可以多行**/*

    • JavaDoc注释:用来注释类、属性和方法等

      使用语法 /** .....*/
      
    • JavaDoc常用标签

    标签 含义 标签 含义
    @author 标识一个类的作者,例如 @author wgy @version 指定类的版本
    @see 指定参考的链接或内容 @param 说明一个方法的参数
    @since 标记一个特定的变化时,@since jdk1.2 @return 说明返回值类型
    /**
     * 学校类
     * @author wgy
     * @version 2.0 2018/03/20
     */
    public class School {
    	/** 
    	*学校名称
        */
    	String schoolName;
    	/**
    	 * 招生方法
    	 * @return total
    	 */
    	public void drawStudent() {
    		System.out.println(schoolName+"开始招生...");
    	}
    	//...
    }
    

    文档注释作用:

    1.编写代码时可通过提示显示文档注释

    2.JavaDoc 工具能够从源代码中抽取类、属性、方法等的注释,形成一个配套的API帮助文档 。

    ​ 演示1:eclipse或idea生成帮助文档。注意编码 -encoding utf-8 -charset utf-8

    ​ 演示2:javadoc -d doc -encoding utf-8 -charset utf-8 srccomqfday23_3Person.java

    总结

    1 Arrays工具类 的使用

    ​ binarySearch() //二分查找

    ​ sort();// 排序

    ​ copyOf();// 复制数组

    ​ copyOfRange();

    ​ fill();// 填充

    ​ toString();//把数组转成字符串形式

    2 方法的参数传递和返回值

    ​ 1 方法的参数传递采用传值方式: 基本类型传递的实际数据 引用类型传递的地址

    ​ 2 方法的返回值,返回数据,基本类型返回实际数据,引用类型返回地址。

    3 二维数组,实际上是由一维数组组成,一维数组的每个元素还是一个数组。

    4 二维数组的声明、初始化、访问(通过下标访问,遍历)

    int[][] arr=new int[][]{{10,20},{30,40}}
    

    5 调试技巧

    ​ 1 添加断点

    ​ 2 单步执行 F6单步跳过 F5单步进入 F8继续执行 ctrl+f12 终止调试

    6 文档注释

    ​ 帮助开发人员生成API文档

    默写

    根据下面要求完成题目:
    1.分别使用静态初始化和动态初始化的方式定义一个数组
    2.对静态初始化的数组分别使用冒泡和选择进行排序,其中,冒泡实现升序,选择实现降序
    3.使用for循环和foreach遍历排好序的数组
    

    作业

    1.班上有3个学生,每个学生都参加了三门功课的考试,其中第二个学生是特长生,上级要求给他每门功课都+5.【要求:使用二维数组做,并且分别使用for循环和增强for循环遍历二维数组】
    2.求一个3*3矩阵对角线元素之和
    10  20  30
    8   6   7
    20  25  50  
      
    

    面试题

    1.二维数数组在内存中的存储方式是怎样的?
    
  • 相关阅读:
    面向对象继承
    webpack 错误提示 Error: Can't resolve 'css-loader'或Error: Can't resolve 'style-loader'
    Math.min() Math.max()
    表单
    addEventListener()
    H5图片背景
    ruby获取最新ruby
    js对象拷贝
    Oh-My-Zsh 下远程ssh的乱码问题
    MSSQL、MySQL 数据库删除大批量千万级百万级数据的优化
  • 原文地址:https://www.cnblogs.com/Zzzxb/p/11369097.html
Copyright © 2011-2022 走看看