javabasic-day05

method_01MethDemo

package com.basic.day05.method;

/**
 * 方法的调用(续)
 * 1. 没有参数的方法调用(自行回顾)
 * 2. 有参数的方法调用:
 * 实际参数,简称实参。在调用时,传入到方法小括号里的变量,或者是具体值。
 * 实参的作用:就是用于给形参赋值(传值),这个过程,称之为传参。
 * 3. void形式的方法调用:
 * 方法名(有形参传入实参)
 * 4. 有具体返回值的方法调用
 * 返回值类型
 */

public class _01MethDemo {
    public static void main(String[] args) {
        //需求1: 计算两个int类型的数据之和
        int m = 5;
        int n = 6;
      /* 调用 sum(int,int)方法:
         调用的时候,m和n是实际参数,要传入方法的括号里
         m给形参a赋值,n给形参b赋值sum(m,n)
       */
        sum(m, n);

        //需求2: 获取三个int类型的随机整数中的最大值。
        int x = (int) (Math.random() * 100);
        int y = (int) (Math.random() * 100);
        int z = (int) (Math.random() * 100);
        System.out.println("x=" + x + "y=" + y + "z=" + z);
        //调用getMax(int,int,int)方法:将实参 x,y,z传给方法形参
        int max = getMax(x, y, z);
        System.out.println("max=" + max);
    }

    /**
     * 用于计算两个int类型数据的和
     *
     * @param a int a
     * @param b int b
     */

    public static void sum(int a, int b) {
        a = 2 * a;
        b = 5 + b;
        int c = a + b;
        System.out.println("c=" + c);
    }

    public static int getMax(int a, int b, int c) {
        int max = Integer.MIN_VALUE;
        if (a > b && a > c) {
            max = a;
        } else if (b > a && b > c) {
            max = b;
        } else {
            max = c;
        }
        return max;
    }
}

method_02RecursionDemo

package com.basic.day05.method;

/**
 * 方法的递归:
 * 方法里调用自己
 * <p>
 * 设定 x=f(n)  计算20的阶乘 f(20)
 * f(20)= f(19)*20
 * f(19)= f(18)*19
 * ******
 * f(2)= f(1)*2
 * f(1)= 1
 * <p>
 * 总结 f(n)= f(n-1)*n
 */


public class _02RecursionDemo {
    public static void main(String[] args) {
        //计算20的阶乘
        long sum = 1;
        for (int i = 1; i <= 20; i++) {
            sum *= i;
        }
        System.out.println("sum=" + sum);
        //1-20的阶乘
        long result = f(20);
        System.out.println("result=" + result);
        //1-100的累加
        long result2 = mySum(100);
        System.out.println("result2=" + result2);
    }

    /**
     * 计算n的阶乘
     *
     * @param n 要计算的数字
     * @return 数字n的阶乘
     */
    public static long f(int n) {
        //需要设置递归的终止操作,n为1时 不需要调用递归方法了
        if (n == 1) {
            return 1;
        } else {
            return f(n - 1) * n;
        }
    }

    /**
     * 定义一个递归方法,计算1~n的和
     */
    public static long mySum(int n) {
        if (n == 1) {
            return 1;
        } else {
            return mySum(n - 1) + n;
        }
    }

}

array_01ArrayDemo

package com.basic.day05.array;

import org.omg.PortableInterceptor.ServerRequestInfo;

import java.util.Arrays;

/**
 * 数组的实例化:
 *   1. 使用new的两种方式  动态初始化
 *      第一种方式: new + 直接初始化具体元素
 *      第二种方式: new + 长度
 *   2. 静态初始化
 *       数据类型[] 变量 = { 元素1, 元素2,,······元素n}
 *
 */

public class _01ArrayDemo {
    public static void main(String[] args) {

        //new + 直接初始化具体元素
        String[] name =new String[]{"小红","小明","小强","张三","李四" };

        //new + 长度  注意:其实有长度个默认元素
        int[] nums =new int[5];//byte,short,int,long对应的默认元素是0
        System.out.println(Arrays.toString(nums));
        double [] prices =new double[5];//float 对应的默认元素是0.0
        System.out.println(Arrays.toString(prices));
        char [] chars =new char[5];//char对应的默认元素是\u0000
        System.out.println(Arrays.toString(chars));
        boolean [] booleans =new boolean[5];//boolean对应的默认元素是false
        System.out.println(Arrays.toString(booleans));
        String [] adds =new String[5];//String对应的默认元素是null
        System.out.println(Arrays.toString(adds));

        //使用静态初始化的方式,实例化一个数组
        //注意 该方式不能先声明 再初始化
        int[] numbers = {1,2,3,4,5};


    }
}

array_02ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 数组的访问:
 *   1. 通过下标访问 : 下标就是元素对应的索引值 下标从0开始
 *   2. 数组的长度: 变量名.length
 *   3. 如何通过下标访问: 变量名[index]
 */

public class _02ArrayDemo {
    public static void main(String[] args) {
        int [] ages = new int[] { 20,18,19,20,19,30};
        //获取ages种的的第一个元素
         int first = ages[0];
         System.out.println(first);
         //获取ages中的第四个元素
         int fourth = ages[3];
         System.out.println(fourth);

         //打印ages数组的长度
         System.out.println(ages.length);
         //直接打印ages中的最后一个元素
         System.out.println(ages[ages.length-1]);


         //将年龄39存入到第二个位置
          ages[1]=39;
          //将年龄50存入最后一位
          ages[ages.length-1]=50;
        System.out.println(Arrays.toString(ages));

        //创建一个具有5个长度的long类型数组
        long [] ns = new long[5];
        //将数字10,,20,30,40,50存入到数组中
        ns[0]=10;
        ns[1]=20;
        ns[2]=30;
        ns[3]=40;
        ns[4]=50;
        System.out.println(Arrays.toString(ns));

        //1~10存入int类型数组 scores
        int [] scores = new int[10];
        for (int i = 0; i < scores.length; i++) {
            scores[i]=i+1;
        }
        System.out.println(Arrays.toString(scores));

    }
}

array_03ArrayDemo

package com.basic.day05.array;

/**
 * 数组下标越界异常;   .ArrayIndexOutOfBoundsException(数组下标异常)
 * 1. 运行期间的异常
 * 2. 当输入的下标大于等于数组的长度或者小于0发生
 * 3. 运行时异常,不做处理,jvm会暴力程序终止
 * <p>
 * 空指针异常:NullPointerException
 * 1. 运行期间的异常
 * 2. 当数组元素为null,或者数组为null
 */

public class _03ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
//        int e1 = nums[5];
//        System.out.println(e1);

//        int e2 = nums[nums.length+10];
//        System.out.println(e2);

        String[] names = {"小明", " micheal", null, "" };
        //打印每个元素字符长度
        for (int i = 0; i < names.length; i++) {
            //处理 null的情况
            if (names[i] == null) {
                continue;
            }
            System.out.println(names[i].length());
        }


    }
}

array_04ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 数组的遍历
 *  1. 使用经典for循环,完成下标里面遍历
 *  2. 使用foreach循环:也叫增强for循环,底层使用的是迭代器
 *        for(元素类型 变量名 :目标数组,集合,枚举){
 *
 *        }
 *  3. 两者的对比
 *       增强for循环中,没有下标的概念
 *       增强for循环中,不能对数组中的元素进行改动
 *       增强for循环比遍历下标的执行效率要高
 *
 */

public class _04ArrayDemo {
    public static void main(String[] args) {
        int[] nums = new int[5];
        nums[0] = 10;
        nums[1] = 20;
        nums[2] = 30;
        nums[3] = 40;
        nums[4] = 50;
        //直接打印数组的变量
        System.out.println( "数组变量"+nums);//直接打印数组名得到的是类全名+@+内存地址16进制数字
        //调用Array.toString();
        System.out.println( "数组字符串"+ Arrays.toString(nums));

        //使用经典for循环,通过下标进行遍历
        for (int i = 0; i < nums.length; i++) {
            //i充当下标
            System.out.print(nums[i] + " ");
        }

        System.out.println();
        System.out.println("---------------------");

        //使用foreach循环遍历上述数组
        for (int n : nums) {
            System.out.print(n+" ");
        }

    }
}

array_05ArrayDemo

package com.basic.day05.array;

import java.awt.font.NumericShaper;
import java.util.Arrays;

/**
 * 数组的排序之:选择排序
 * 原理:
 * 第一轮:拿0索引处的元素与后面的元素一一做比较,满足条件就交换,每次交换都保证0索引处是最小值
 * 一轮结束,0索引处是最小值
 * 第一轮:拿1索引处的元素与后面的元素一一做比较,满足条件就交换,每次交换都保证1索引处是次小值
 * *            一轮结束,1索引处是次小值
 * 一次比较下去。
 * 比较的轮次: 元素个数-1 *
 * <p>
 * 通过分析,轮数是由外层循环控制,
 * 每一轮的比较由内层循环控制
 */

public class _05ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {6, 5, 3, 2, 4, 1};
        //外层循环控制轮数
        for (int i = 0; i < nums.length - 1; i++) {
            //内层循环控制比较
            for (int j = i + 1; j < nums.length; j++) {
                //sum[i] 需要判断的索引位置上的元素
                //sum[j] 比较判断索引位置上的元素

                //定义一个临时变量
                int temp = 0;
                if (nums[i] > nums[j]) {
                    temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }

            }

        }
        System.out.println(Arrays.toString(nums));
    }
}

array_06ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 将一个数组的第一个元素,看成是有序的。然后拿第二个元素与前面的元素从左到右依次做比较。如果小于等于某一个元素
 * 则进行插入。该位置处及其以后的有序元素都要向后移动一位。
 *
 *  原数组:   4  6  3  1  2  7
 *  第一次:   4 | 6  3  1  2  7
 *            比较一次
 *  第二次:   4 6 | 3  1  2  7
 *            3和4比较。 需要插入
 *            3存起来,每个元素向后移动
 *           结果:
 *           3 4 6 | 1 2 7
 *  第三次:  需要插入,   1存起来, 移动元素
 *           结果:
 *           1 3 4 6 | 2 7
 *  第四次:  需要插入   2存起来  移动元素
 *           结果:1 2 3 4 6| 7
 *  第五次:  不需要插入
 *
 *      分析:
 */
public class _06ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {4,6,1,3,2,7};
        // 分别拿nums[1] 到 nums[length-1]
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if(nums[i]<nums[j]){
                    int temp = nums[i];
                    //向后移动,然后插入。
                    move(nums,j,i);
                    nums[j] = temp;
                    break;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
    }

    /**
     * arr,是要移动的数组
     * @param arr    [ .... 1,4,6     3 ]
     * @param max             min     max
     * @param min
     */
    public static void move(int[] arr,int min,int max){
        for(int i=max;i>min;i--){
            arr[i] = arr[i-1];
        }
    }

//    public static void main(String[] args) {
//        int[] arr = {1,2,3,4,5};
//        move(arr,0,4);
//        System.out.println(Arrays.toString(arr));
//    }
}

array_07ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 插入排序的第二种方法
 */

public class _07ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {6, 2, 3, 4, 1, 7};
        //从下标1开始拿到排序,默认0位置是排好序的
        for (int i = 1; i < nums.length; i++) {
            // 用拿到的i元素与前一位元素进行比较,如果小于前一位元素,则进行插入排序
            if (nums[i] < nums[i - 1]) {
                int j;
                int temp = nums[i];//存储需要插入的元素 ,放在覆盖
                //从后往前比较,如果小于前一位元素,则进行插入排序
                for (j = i - 1; j >= 0 && temp < nums[j]; j--) {
                    //如果j大于temp,将前一位的元素后移
                    nums[j + 1] = nums[j];
                }
                //将temp插入到j+1的位置
                nums[j + 1] = temp;
            }
        }
        System.out.println(Arrays.toString(nums));
    }

}

array_08ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 冒号排序:
 *       从左到右,紧挨着的两个元素进行比较
 *
 *       例如六元素
 *       第一轮找到最大值,冒号到最右侧
 *       第二轮找到次大值
 *       依次找到剩余值
 *       第五轮找到次小值和最小值
 *
 *    注意 每一轮比较时都是从最左边的元素开始
 *
 *    六个元素:
 *    i=0 j=5
 *    i=1 j=4
 *    i=2 j=3
 *    i=3 j=2
 *    i=4 j=1  j<length-1-i
 */

public class _08ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {6,2,4,7,1,5};

        //外层循环控制比较轮数,论述等于leng-1
        for (int i = 0; i < nums.length - 1; i++){
            //内层控制每轮如何比较,从左边开始比较,j从0开始
            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(Arrays.toString(nums));
        }
    }
}

array_09ArrayDemo

package com.basic.day05.array;

/**
 * 从数组中查找元素:
 *   1. 可与使用顺序查找法
 */

public class _09ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {100,23,48,56,10,78};
        //需求 :查找数组中是否存在元素为56的元素,如果有返回左边,没有返回 -1
//        int index = -1;
//        for (int i = 0; i < nums.length; i++) {
//            if(nums[i] == 56){
//                index = i;
//                break;
//            }
//        }
//        System.out.println(index);
        int index = find(nums,56);
        System.out.println(index);
    }
    /**
     * 需求: 查找int数组arr中是否有n,如果有返回坐标,如果没有返回-1
     */
    public static int find(int[] arr,int n){
        int index = -1;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == n){
                index = i;
                break;
            }
        }
        return index;
    }

}


array_10ArrayDemo

package com.basic.day05.array;

/**
 * 数组元素的二分查找法:
 */

public class _10ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int index = binarySearch(nums, 7);
        System.out.println(index);

    }
    /**
     * 写一个使用二分查找算法,从int类型的数组arr中找元素element的方法
     * 发到,返回其坐标,没找到,返回-1
     */
    public static int binarySearch(int[]arr,int element){
        int min = 0,max = arr.length-1;
        // min <= max时,表示还未找到该元素, min=max,是最后一次查找
        while(min<=max){
            //找到中间元素下标
            int mid = (min+max)/2;
            if(arr[mid]==element){
                // 如果min位置是目标元素,则返回下标
                return mid;
            }else if(arr[mid]<element){// 如果中间元素小于目标元素,表明在中间值右侧
                min = mid+1; // 将min设置为中间下标+1,重新循环
            }else{// 如果中间元素大于目标元素,表明在中间值左侧
                max = mid-1; // 将max设置为中间下标-1,重新循环
            }
        }
        return -1;
    }
}

array_11ArrayDemo

package com.basic.day05.array;

import java.util.Arrays;

/**
 * 学习一下Arrays工具类的用法
 * 1. toString():将数组转换为字符串形式。
 * 2. binarySearch():在已排序的数组中査找指定元素的索引。(必须升序)
 * 3. fill():将数组的所有元素都设置为指定值。了,
 * 4. sort(数组):对数组进行排序。4
 * 5. copyOf():将一个数组的部分或全部元素复制到一个新数组中。
 */

public class _11ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,6,7,8,9,10};

        //转换为字符串
        String info = Arrays.toString(nums);
        System.out.println(info);
        System.out.println(Arrays.binarySearch(nums,5));

        //二分查找 (升序)
        int index = Arrays.binarySearch(nums,5);
        System.out.println(index);

        //指定填充
        Arrays.fill(nums,100);
        System.out.println(Arrays.toString(nums));

        //Arrays.sort(数组名); 只能对已经设置好排序规则的类的数组进行排序。
        int[] nums2 ={2,3,1,4,5,};
        Arrays.sort(nums2);
        System.out.println(Arrays.toString(nums2));

        // 复制数组(扩容)
        int[] nums3 = Arrays.copyOf(nums2,10);
        System.out.println(Arrays.toString(nums3));


        //指定长度一样,完全copy,与原数组相同
        int[] nums4= Arrays.copyOf(nums2,nums.length);

        // 小于原长度 ,截取
        int[] nums5 = Arrays.copyOf(nums2,3);
        System.out.println(Arrays.toString(nums5));


    }
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值