今日内容

数组
方法

数组的反转:数组中的元素颠倒顺序,如数组1,2,3,4,5,数组反转后变成5,4,3,2,1.

思路:本质是交换两个变量的值。两种方式

  • 实现反转,就需要将数组的最远端和最近端元素互换。
  • 定义两个变量,保存数组的最小索引和数组的最大索引。
  • 让两个索引上的元素交换位置
  • 最小的索引变量++,最大的索引变量–,再次交换位置
  • 最小的索引超过了最大索引,数组反转结束
【需要借助第三方变量】
准备一个需要反转的数组 int[] arr = {1,2,3,4,5,6};
定义两个索引变量,一个索引变量指向最小索引,一个索引变量指向最大索引
int min = 0;
int max = arr.length-1;
遍历数组,让两个索引变量产生变化
min++;
max--;
条件 min < max
交换最小索引元素和最大索引元素,需要定义第三方变量
int temp = 0;
temp = arr[min];//把最小的索引元素赋值给第三方变量temp
arr[min] = arr[max];//把最大的索引元素赋值给最小索引的元素
arr[max] = temp;//把第三方变量的值赋值给最大索引的元素
public static void main(String[] args){
    int[] arr = {1,2,3,4,5};
    //遍历数组 for 循环次数已知
    //for(1;2;4){3}   初始化语句一般要放在循环内,逗号隔开多个语句,循环结束循环内定义的变量直接释放
    //方法一  定义三个变量
    //定义最小索引为min,最大索引为max,交换时需要借助第三变量
    for(int min = 0,int max = arr.length-1; min < max; min++, max--){
       int temp = arr[min]; //变量初始化
       arr[min] = arr[max];
       arr[max] = temp;
    }
    //查看反转之后的数组内容
    for(int i = 0; i <= arr.length-1; i++){
        System.out.println(arr[i]);
    }
    
    //方法二  定义两个变量
    //定义一个最小的索引变量 i最大的索引值为arr.length-1-i.交换时需要借助第三变量
    //当i=0时,最小索引0,最大索引arr.length-1-0;
    //当i=1时,最小索引1,最大索引arr.length-1-1;
    //结束交换---> 
    for(int i = 0; i < arr.length/2; i++){
        int temp = 0;//一定要设置初始值(初始化),变量初始化以后才能使用
        temp = arr[i];
        arr[i] = arr[arr.length-i-1];
        arr[arr.length-i-1] = temp;
    }
    for(int i = 0; i <arr.length; i++){
        System.out.println(arr[i]);//2
    }
}
二维数组

定义方式:和一维数组是一样的,也有三种方式

java 两个数组是否存在交集关系 java 两数组交换_数组

方式一:
数组的数据类型[][] 数组名称 = new 数组的数据类型[长度1][长度2];
长度1 不可省略,代表该二维数组里面存储的元素个数
长度2 可省略,代表该二维数组里面的元素(数组里面的元素个数),而且它里面的数组元素个数一样
如: int[][] arr = new int [3][2];
长度3----该arr数组里面有3个元素(数组)
长度2----该arr数组里面的每个数组元素都有2个元素
相当于--- int[][] arr = {{0,0},{0,0},{0,0}};
方式二:
数组的数据类型[][] 数组名称 = new 数组的数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}...{元素1,元素2...}};
方式三:
数组的数据类型[][] 数组名称 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}...{元素1,元素2...}};
二维数组元素访问方式

借助于【索引】

格式:

数组名称[索引]---访问的是二维数组的元素
//访问二维数组当中的一维数组里面的元素
数组名称[一维数组的索引值][一维数组里面的元素索引值]
如 int[][] arr = {{10,20,50},{30,40,80},{15,100}};
//访问arr数组当中的10元素
arr[0][0] = 10;
//访问arr数组的80元素
arr[1][2]

方法

概念:在程序中要去是实现的某一个功能,需要包含多条语句,这些语句包含循环语句结构、选择语句结构等等共同来处理一件事情。

定义方法的格式详解
public static void main(String[] args){
    //方法体内容
	return 
}
方法比喻成工厂
    	蒙牛工厂 
    		  产出物:奶制品
    	void  空的,无效的,
    	String[] args 参数--->变量

方法定义的完整格式:修饰符 返回值类型 方法名称(参数类型1 参数名称1,参数类型2 参数名称2。。。){}

修饰符: public static

返回值类型: void 方法最终产生的数据结果是什么样的

方法名称: main 【不是关键字】方法的名字,名字自定义–标识符,采用小驼峰

参数类型:进入方法当中的数据的类型

参数名称: 进入方法当中的数据对应的变量名称

方法体: 方法需要执行的功能,由若干行代码组成的。

return:【关键字】一般认为有两个作用。第一将后面的返回值返回给程序;第二停止当前正在执行的方法。

返回值: 就是方法执行最终产生的数据结果。

备注:

  • return后面的【返回值】,必须和方法声明上的【返回值类型】保持一致。
  • 方法不允许嵌套,不允许定义在类的外面
  • 方法只能并列,并且必须定义在类的里面 。
//定义两个int数字相加的方法
public class MethodDemo01{
    public static void main(String[] args){
        //定义两个int数字相加的方法,得到一个结果
        //定义一个方法的三要素
        /*
        	返回值类型:int 返回值类型和数据类型是一样的
        	方法名称:sum
        	参数列表:int a, int b
        */
        //方法定义的完整格式:修饰符 返回值类型 方法名称(参数类型1 参数名称1,参数类型2 参数名称2。。。){}
        
        //1单独调用
    	sum(10,20);
        System.out.println("========");
        //2打印调用
    	System.out.println(sum(10,20));
        System.out.println("========");
        //3赋值调用
    	int number = sum(10,20);
        System.out.println("number的值为:" + number);
        
        /*//1单独调用
    	eatFoof("小刘","小明");
        System.out.println("========");
        //2打印调用
    	System.out.println(eatFoof("晓莉","小明"));
        System.out.println("========");
        //3赋值调用
    	String number = eatFoof("小明","小红");
        System.out.println("number的值为:" + number);
        
        会出错,类型不一致。函数返回类型为void。引用为空?
        */
	}
    	public static int sum(int a, int b){
            System.out.println("方法调用1");
    		int result = a + b;
            //此时方法需要有返回值  需要用到返回值语句
            //格式:return 具体的返回值;
    		return result;
		}
    //定义两个人去吃饭功能
    /*
    	方法定义的三要素:
    	返回值类型:void
    	方法名称:eatfood
    	参数列表: String p1, String p2
    */
    public static void eatFoof(String p1, String p2){
        System.out.println("今天是一个吃饭的好天气");
    }
}
方法调用【重点】

三种调用格式:

  1. 单独调用:方法名称(参数具体值);
  2. 打印调用:System.out.println(方法名称(参数具体值));
  3. 赋值调用:数据类型 变量名称 = 方法名称(参数具体值);
    备注:
    当返回值类型是void的时候,这种方法只能单独调用,不能进行打印调用或者赋值调用。
    返回值类型一般可以理解为数据类型(基本数据类型和引用数据类型),此外还包含一种void类型。当方法执行完毕不需要给程序的调用者返回任何的数据结果时,可以指定该方法的返回值类型为void,此时只能【单独调用】。

1 方法开始调用

2实际参数传递

3方法体内执行

4方法结束返回 :将返回值返回给程序调用者位置

注意事项:
  1. 方法定义的先后顺序无所谓
  2. 方法定义不能嵌套,不能在一个方法内部定义另外一个方法
  3. 方法定义之后,自己不会执行,如果希望执行,一定要进行方法的调用
方法重载

对于功能类似的方法来说,因为参数列表不一样,却需要定义不同的方法名称,记忆麻烦。

public class MethodDemo03{
    public static void main(String [] args){
        //计算一个整数和一个小数的和,整数为第一个参数,小数为第二个参数
        int num = sum03(10,3.14);
        //计算一个整数和一个小数的和,小数为第一个参数,整数为第二个参数
        int num = sum03(3.14,10);
    }
    
    //计算两个数的和,得到一个整数
    
    //计算两个整数的和
    public static int sum01(int a, int b){
        return (a+b);
    }
    
    //计算两个小数的和
    public static int sum02(double a,double b){
        return (int)(a+b);
    }
    
    //计算一个整数和一个小数的和
    public static int sum03(int a, double b){
        return (int)(a+b);
    }
    
    //计算一个小数和一个整数的和
    public static int sum04(double a, int b){
        return (int)(a+b);
    }
    
    public static int sum04(double d, int e){
        return (int)(d+e);//与上面方法一样,报错
    }
}

如果在类中定义方法时,方法的参数列表不一样,虽然方法名称一样,但是程序会认为这是一个新方法。

方法重载(overload):在一个类中,多个方法名称一样,但是参数列表不一样。

好处:只需要记住唯一一个方法名称即可,就可以实现类似的多个功能

方法的重载与哪些因素有关:

  1. 参数个数不同
  2. 参数类型不同
  3. 参数多类型顺序不同

方法重载与哪些因素无关:

  1. 与参数的名称无关
  2. 与方法的返回值类型无关
  3. 与方法的修饰符无关
练习:在调用输出语句时,不管传入什么类型的数据,都把该数据打印在控制台中
    模拟输出语句中的println方法效果,传递什么类型的数据,就输出什么类型的数据,只允许定义一个方法println
public static void main(String[] args){
    public static int println
}

public void println(int a){
    System.out.println(a)
}
public void println(char a){
    System.out.println(a)
}
public void  println(String a){
    System.out.println(a)
}
public void println(double a){
    System.out.println(a)
}
public void println(byte a){
    System.out.println(a)
}
public void println(long a){
    System.out.println(a)
}
public void println(boolean a){
    System.out.println(a)
}
public void println(float a){
    System.out.println(a)
}
//判断以下哪些方法时重载关系
public static void add(){}//正确重载
public static void add(int a){}//正确重载
static void add(int a,int b){}//代码错误:与第8行冲突
public static void add(double a,int b){}//正确重载
public static void add(int b,double a){}//代码错误:和第6行冲突
static void add(int a, double b){}//代码错误:和第5行冲突
public static void Add(){}//代码正确不会报错,但是不是有效重载
public static void add(int i,int j){}//代码错误:和第3行冲突
数组作为方法参数和返回值
数组作为方法参数

数组作为应用类型能够当成方法的参数进行传递

数组作为方法参数传递,传递的参数是数组内存的地址

public static void main(String[] args){
    int[] arr = {1,2,3,4,5};
    //调用方法,传递数组,输出数组内存地址
    println(arr);
}

/*
	创建方法,方法接收数组类型的参数
	进行数组的遍历
*/
public static void println(int[] arr){
    //数组遍历
    for(int i = 0; i <= arr.length-1;i++){
        System.out.println(arr[i]);
    }
}

java 两个数组是否存在交集关系 java 两数组交换_数组_02

数组作为方法的返回值
  • 数组作为方法的返回值,返回的是数组的内存地址。
public static void main(String[] args){
    //调用方法,接收数组的返回值
    //接收到的是数组的内存地址
    int[] arr = getArray();
    System.out.println(arr);//此时是一个内存地址哈希值
}
    /*
    	创建方法,返回值是数组类型
    	return 返回数组的内存地址
    */
 public static int[] getArray(){
     int[] arr = {1,3,5,9,11};
     //此时返回数组的内存地址,返回给调用者
     return arr;
}

一个方法可以有0,1,多个参数;但是只能有0个或者1个返回值,不能有多个返回值。如果我们希望一个方法当中产生了多个结果数据,这些多个结果数据同时需要返回,解决方案:使用一个容器(数组),作为方法的返回值类型即可。

public static void main(String[] args){
    int a = 10;
    int b = 20;
    change(a,b);
    System.out.println(a);//a=10
    System.out.println(b);//b=20

}
public static void change(int a, int b){//变量的定义域,两个a b不同/没有return
    a = a + b;//30
    b = b + a;//50
}
public static void main(){
    int[] arr ={10,20};
    changeArray(arr);
    System.out.println(arr[0]);//arr[0]=30
    System.out.println(arr[1]);//arr[1]=50

}
public static void changeArray(int[] arr){//引用传递,传递地址
    arr[0]=30;
    arr[1]=50;
}
作业
int[][] arr={{10,20,50},{30,40,80},{15,100}};
//排序之后的数组内容:
{{10,15,20},{30,40,50},{80,100}};
//二维数组累加求和
int[][] arr={{10,20,50},{30,40,80},{15,100}};
package order;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
/*
    二维数组排序
    思路:1.二维转一维:二维数组行数、二维数组列数、二维数组的元素个数  使用循环遍历两成for循环
         2.一维排序:使用排序方法(冒泡)两层for循环。
         3.打印排序好的二维数组:循环遍历打印,注意变成二位数组。

*
*/
public class TwoArray {
    public static void main(String[] args) {
        int[][] arr = {{5,4,1},{2,7},{3,6,8},{3,6}};
        int count = 0;
        int count1 = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                count++;//计算出二维数组arr的总共个数
            }
            count1++;//计算出二维数组的一维数组个数
        }

        System.out.println(count);
        System.out.println(count1);
        System.out.println("===============");
        int sum = 0;
        int[] arr1 = new int[count];
        int count3 = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr1[count3]= arr[i][j];
                System.out.print(arr1[count3]);
                count3++;//将二维数组arr赋值给一维数组arr1
                sum += arr[i][j];
            }
            System.out.println();
        }
        System.out.println("总数是" + sum);

        System.out.println("==========");
        for (int i = 0; i < count; i++) {
            for (int j = i; j < count; j++) {
                if(arr1[i]>arr1[j]){//一维数组ar1升序排序
                    int temp = arr1[i];
                    arr1[i] = arr1[j];
                    arr1[j] = temp;
                }
            }
        }

        int count4 = 0;
            for (int i = 0; i < count1; i++) {
                for (int k = 0; k < arr[i].length; k++) {

                        arr[i][k] = arr1[count4];
                    System.out.print(arr[i][k]);
                    count4++;
                    }
                System.out.println();
                }
            }
            }