java、day9 1.方法 2.数组 增强for循环 遍历 冒泡排序接触,翻转数组等一系列问题

1.方法

java中都是直传递

1.1什么是方法

  • 和c语言中的函数比较相似

  • 用代码片段来完成某些特定的功能

1.2方法的定义

1.2.1实参

 实际参数,实际调用给函数的

1.2.2形参

 形式参数,用来定义的
 package method;
 
 public class MethodDemo1 {
     public static void main(String[] args) {
 //       实际参数,实际调用给函数的
         int sum =add(2,3);
         System.out.println(sum);
    }
 //方法,相当于函数 可以是public int add 调用比较麻烦,和类变量相识,所以加一个static
 //   形式参数,用来定义的指其中的inta。intb
     public static int add(int a,int b){
 
         return a+b;//方法终止,方法在碰到return时就会自动结束
    }
 }

1.2.3可变参数(较为重要)

也叫不定向参数,注意事项,只能在几个定义好的参数的后面,相当于一个数组

就是int...(三个点)

 public class MethodDemo3 {
     public static void main(String[] args) {
 //       new MethodDemo3(); alt+回车
         MethodDemo3 methodDemo3 = new MethodDemo3();
         methodDemo3.test(1,43,435,545,5);
    }
 //   必须要放在多个定义参数的后面,比如test(int... i,int1)就不行
 //   但是test(int1,int...i)就可以
     public  void test(int... i){
         System.out.println(i[0]);
         System.out.println(i[1]);
         System.out.println(i[2]);
         System.out.println(i[3]);
         System.out.println(i[4]);
    }
 }
 结果:
 1
 43
 435
 545
 5
     

 

1.3方法调用

1.3.1调用方法

对象名.方法名

1.4方法的重载

有的时候需要的函数相同,但是返回值不同,有的是int 有的是double,所以要方法重载

1.4.1方法重载的规则

1.5命令行传参(不经常使用)

命令行参数就是在执行程序时可以紧紧跟在名字后面

 package method;
 
 public class MethodDemo2 {
     public static void main(String[] args) {
 //     args.length     数组长度
         for (int i = 0; i < args.length; i++) {
             System.out.println("args["+i+"]:"+args[i]);
        }
    }
 
 }
 

1.5.1命令行运行

  1. 首先打开java文件所在位置,并且用cmd打开

  2. 编译javac 文件.java

  3. 返回到包名的最前面,比如包是com.baidu.www那就返回到scr

  4. 接下来运行改文件 要加上包名java com.baidu.www.文件 da sha bi (接下来的数组如上图所示)

1.6递归

1.6.1什么是递归

递归就是自己调用自己(java使用不当会报错溢出),正确使用会大大减少代码量

递归结构包含两个部分一个是

递归头:必须有尽头,不然将陷入死循环

递归体:什么时候需要调用自身方法

边界条件:比如下面这个程序就会执行到jie(1然后返回1)

因为java使用的是栈机制,就是一个罐子里(main函数)放很多方法,用一个去一个

所以使用递归就会大量调用方法,一般来说不太推荐

1.6.2递归使用阶乘

 public class MethodDemo4 {
 //   5的阶乘就是5*4*3*2*1
 public static void main(String[] args) {
     System.out.println(jie(5));
 }
 
 public static int jie(int i){
     if (i==1){
         return 1;
    }else {
         return i*jie(i-1);//递归头,一直递归到1
    }
 }
 }

 

2.数组

2.1什么是数组

  • 数组是相同数据类型的有序集合

  • 是通过下标来指定

2.1.1数组的四个特点

  1. 其长度是确定的,不可以改变

  2. 元素必须是想同类型

  3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型

  4. 数组也可以看成对象,数组中的每个元素相当于该对象的成员变量

  5. 数组本身即是对象java中对象就是在堆中

  6. 下标边界【0,length-1】,越界就会报错

2.2数组创建声明(有两种声明方式)

 //变量的类型 变量的名字 =变量的值
 int a =0;
 //数组的类型 数组的名字 =数组的值
 int[] nums;//1、一个数组
 nums = new int[10];//2、创建一个分配10个空间数组
 //没有赋值就默认是0
 
 //也可以
 int nums=new int[10];

 

2.2.1在中间加中括号(在类型名)

 dataType[] arrayRefVar;

 

2.2.2在最后加中括号(在变量名)

 dataType arrayRefVar[];

2.3创建一个数组,求数字内所有数字的和

 public class ArrayDemo1 {
     public static void main(String[] args) {
         int[] nums = new int[10];
         nums[0]=5;
         nums[1]=5;
         nums[2]=5;
         nums[3]=5;
         nums[4]=5;
         nums[5]=4;
         nums[6]=3;
         nums[7]=2;
         nums[8]=1;
         nums[9]=6;
         int sum1 = 0 ;
         int sum2 = 0 ;
         //nums.length数组的长度
         for (int i = 0; i < nums.length; i++) {
             sum1+=nums[i];
        }//弹幕里面说可以nums.for遍历数组,暂时还未解除
         System.out.println(sum1);
 
    }
 }

2.4数组内存分析

  1. 首先是声明数组 在栈中开辟了一个位置

  2. 然后在队中new出一个空间存放10个块

  3. 最后给这10个块赋值

  4. 这里开辟了十个空间,如果想找a[11],就会出现错误.ArrayIndexOutOfBoundsException(大致意思就是超出了边界)

2.5数组创建的三种初始化状态

2.5.1静态初始化

 int[] a={1,2,3};
 Man[] mans = {new Man(1,1),new Man(2,2)};

 

2.5.2动态初始化

 int[] a = new int[2];
 a[0]=1;
 a[1]=5;

 

2.5.1默认初始化

  • new以后创建空间后每个元素都是默认值

2.6数组使用

2.6.1简单for循环打印全部的数组元素

2.6.2计算数组内所有元素的和

2.6.3找到数组内最大的数字

2.6.4增强for循环遍历数组,打印出所有数字

2.6.5数组可以作为参数,也可以作为返回值

2.6.6反转数组

 public class ArrayDemo2 {
     public static void main(String[] args) {
         int[] nums1 = new int[3];
         nums1[0] = 3;
         nums1[1] = 6;
         nums1[2] = 7;
         int[] nums2 = {5,1,5,9,7};
         int sum = 0;
         int max = 0;
 //     1.简单for循环,打印全部的数组元素
         for (int i = 0; i < nums2.length; i++) {
             System.out.println(nums2[i]);
        }
 //       2.计算所有元素的和
         for (int i = 0; i < nums2.length; i++) {
             sum+=nums2[i];
        }
 //     3.找到max里面最大的值
         for (int i = 0; i < nums2.length; i++) {
             if(nums2[i]>max){
                 max=nums2[i];
            }
        }
 //     4. 增强for循环nums2.for但是没有下标,不能操作元素,适合打印元素
         for (int i : nums2) {
             System.out.println(i);
        }
         System.out.println("max:"+max);
         System.out.println("sums"+sum);
         printArray(nums2);
 
 //       反转数组打印
         printArray(reverse(nums2));
 
 //       for (int i : nums2) {
 //           System.out.println(nums2[i]);
 //       }
 //       5. 作为方法的参数,利用方法打印数组内的内容
 
        }
         public static void printArray(int[] arrays){
             for (int i = 0; i < arrays.length; i++) {
                 System.out.println(arrays[i]+"");
            }
        }
 //     6.利用数组作为返回值和参数使数组内的所有数倒置
         public static int[] reverse(int[] arrays) {
             int[] result = new int[arrays.length];
             int j = arrays.length - 1;
             for (int i = 0; i < arrays.length; i++) {
                 result[j] = arrays[i];
                 j--;
            }
             return result;
        }
 
    }

2.7二维数组

2.7.1二维数组长什么样子

 public class ArrayDemo3 {//同理,多维数组也是一样的
     public static void main(String[] args) {
         int[][] a = {{1,2},{2,5},{4,7}};
         System.out.println(a[0].length);
         System.out.println(a.length);
    }
 }//a[0][1]=1; a[2][2]=5;
 结果:
 2
 3
     
 //也可以这样初始化
     int[][] a = new int[11][11];

2.8数组toString的使用(帮助文档)

 public class ArrayDemo3 {
     public static void main(String[] args) {
         int[][] a = {{1,2,},{2,5},{4,7},{4,3}};
         int[] b = {5,1,5,9,7};
         System.out.println(a[0].length);
         System.out.println(a.length);
         printarrays(a);
         System.out.println(Arrays.toString(b));
         printArray(b);
 
    }
 
     public static void printarrays(int[][] array){
         for (int i = 0; i < array.length; i++) {
             for (int j = 0; j < array[0].length; j++) {
                 System.out.println(array[i][j]);
 
            }
 
        }
    }
 
 
 //和tostring一样的效果
     public static void printArray(int[] arrays){
         System.out.print("[");
         for (int i = 0; i < arrays.length; i++) {
             if (i<arrays.length-1){
                 System.out.print(arrays[i]+", ");
            }else if (i==arrays.length-1){
                 System.out.print(arrays[i]+"]");
            }
        }
    }
 }
 
 结果
 2
 4
 1
 2
 2
 5
 4
 7
 4
 3
 [5, 1, 5, 9, 7]
 [5, 1, 5, 9, 7]

2.9稀疏数组(一种数据结构)以旗子举例***

个人理解是,假如原本用数组记录,那就需要42个空间来储存这些值

  int[][] a = new int[7][5];
  然后我可以按照后面的表格来记录
  那么只需要int[][] b = new int[8][3];一共24个空间来存放值就可以了

2.9.1利用结论自己想一下办法存储和打印数组

  • 这里分析一下,因为只有第二行第三列和第三行第四列有值

  • 那我只需要一个3 3的数组就可以了 (自己思考一下,当这个棋盘变了,如何使这个压缩函数自动变化)

  •  

     package array;//水平不行,自己快些了三小时了,想了很久
     
     import static array.ArrayDemo3.printarrays;
     
     public class ArrayDemo5 {
         public static void main(String[] args) {
             int[][] qizi = new int[11][11];
     
             qizi[1][2] = 1;
             qizi[2][3] = 2;
             printarrays1(qizi);
     //       int[][] yaSuo = new int[3][4];
             System.out.println("有效数字个数为:"+sumDo(qizi));
             int geShu = sumDo(qizi);
             int[][] array2 = new int[geShu+1][3];
             int[][] XiSHU = xiShu(qizi,array2);
             int[][] FANHUIZHI= backArray(XiSHU);
             printarrays1(XiSHU);
             printarrays1(FANHUIZHI);
     
     
        }
     //   获取有效值的个数
         public static int sumDo(int[][] array){
             int sum = 0;
             for (int i = 0; i < array.length-1; i++) {
                 for (int j = 0; j < array[0].length-1; j++) {
                     if (array[i][j]!=0){
                         sum++;
                    }
                }
     
            }
             return sum;
        }
     
     //   存储为稀疏数组,第一个数组是测其一共有多少个有效数字,第二个数组是返回值
         public static int[][] xiShu(int[][] array1,int[][] array2){
             int geShu = sumDo(array1);
             array2[0][2] = geShu;
             array2[0][1] = 11;
             array2[0][0] = 11;
             int hang = 0;
             for (int i = 0; i < array1.length-1; i++) {
                 for (int j = 0; j < array1[i].length-1; j++) {
                     if (array1[i][j]!=0){
                         hang ++;
                         array2[hang][0] = i;
                         array2[hang][1] = j;
                         array2[hang][2] = array1[i][j];
                    }
                }
     
            }
             return array2;
        }
     //   输出稀疏数组arrays1应该存放稀疏数组,arrays2应该返回原数组
         public  static int[][] backArray(int[][] arrays1){
             int[][] arrays2= new int[arrays1[0][0]][arrays1[0][1]];
             for (int i = 1; i <arrays1.length; i++) {
                 arrays2[arrays1[i][0]][arrays1[i][1]]=arrays1[i][2];
            }
             return arrays2;
        }
     
     
     
         //打印二元数组,也可以用遍历
         public  static void printarrays1(int[][] arrays){
             for (int i = 0; i < arrays.length; i++) {
                 for (int j = 0; j < arrays[i].length; j++) {
                     System.out.print(arrays[i][j]+"\t");
                     //相当于tab键
                }
                 System.out.println();
            }
        }
         //增强for循环遍历二维数组
         public  static void printarrays2(int[][] arrays){
             for (int[] array : arrays) {
                 //arrays.for相当于将二维数组存到每个一维数组里面
     
                 for (int i : array) {
                     //再将每个一维数组的值取出来
                     System.out.print(i+"\t");
                }
                 System.out.println();
            }
     
        }
     }
     

     

2.9.2增强for循环遍历二维数组

 public  static void printarrays2(int[][] arrays){
     for (int[] array : arrays) {//arrays.for
         for (int i : array) {//array.for
             System.out.print(i+"\t");
        }
         System.out.println();
    }
 }

3.排序初接触之冒泡排序与简单优化

 public class ArrayDemo4 {
     public static void main(String[] args) {
         int[] a = {3,4,5,2,8,7,10,50,32,54,45};
         int temp = 0;
         for (int i = 0; i < a.length-1; i++) {
             boolean flag = false;//优化,若是某一轮已经排好了,那么就跳出循环
             for (int j = 0; j <a.length-1-i ; j++) {
                 if (a[i]>a[i+1]){
                     temp=a[i];//赋值给中间值,再交换两个值的大小
                     a[i]=a[i+1];
                     a[i+1]=temp;
                     flag =true;
                }
            }
             if (flag==false){
                 break;
            }
        }
         printArray(a);
    }
     public static void printArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.println(arrays[i]+"");
        }
    }
 }
 

 

posted @ 2022-03-20 22:13  newlive122  阅读(57)  评论(0)    收藏  举报