Java基础-Day07

Java基础-Day07

数组中涉及到的常见算法

  • 二分法

  • 排序算法

package com.lurenj.java;
/**
 * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
 *
 */

import java.util.Arrays;
public class ArraysTest {
    public static void main(String[] args) {
        //1.boolean equals(int[] a,int[] b):判断两个数组是否相等
        int[] arr1 = new int[]{1,2,3,4};
        int[] arr2 = new int[]{1,3,2,4};
        boolean isEquals = Arrays.equals(arr1,arr2);
        System.out.println(isEquals);
        //2.String toString(int[] a):输出数组元素
        System.out.println(Arrays.toString(arr1));
        //3.void fill(int[] a,int val):替换数组元素
        Arrays.fill(arr1,10);
        System.out.println(Arrays.toString(arr1));
        //4.void sort(int[] a):排序,默认从小到大
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));
        //5.int binarySearch(int[] a,int key):找数组中相关索引
        int[] arr3 = new int[]{1,2,3,5};
        int index = Arrays.binarySearch(arr3,5);
        if (index >= 0){
            System.out.println(index);
        }else {
            System.out.println("未找到!");
        }

    }
}

package com.lurenj.java;
/*
* 数组的冒泡排序
*
* */
public class BubbleSortTest {
    public static void main(String[] args) {
        int[] arr = new int[]{43,32,78,-91,11,0,11,64,32,-21,99};

        //冒泡排序,从小到大
        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;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
}

package com.lurenj.java;

/*
* 算法的考察:数组的复制、反转、查找(线性查找、二分法查找)
* */
public class ArrayTest3 {
    public static void main(String[] args) {
        String[] arr = new String[]{"AA","DD","CC","BB","MM"};

        //数组的复制(区别于数组变量的赋值,arr = arr1)
        String[] arr1 = new String[arr.length];
        System.out.println("arr:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }

        System.out.println();
        System.out.println("arr1复制:");
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = arr[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr[i] + "\t");
        }

        System.out.println();
        System.out.println("arr反转:");
        //数值反转
        //方法一:
//        for (int i = 0; i < arr.length / 2 ; i++) {
//            String temp = arr[i];
//            arr[i] = arr[arr.length - i -1];
//            arr[arr.length - i -1] = temp;
//        }
        //方法二:
        for (int i = 0,j = arr.length - 1;i < j;i++,j--){
            String temp = arr[i];
            arr[i] = arr[arr.length - i -1];
            arr[arr.length - i -1] = temp;
        }

        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr[i] + "\t");
        }

        //查找(或搜索)
        //线性查找
        System.out.println();
        String dest = "BB";

        boolean isFlag = true;

        for (int i = 0; i < arr.length; i++) {
            if(dest.equals(arr[i])){//比的是内容是否相等
                System.out.println("找到了指定的元素,位置为:" + i);
                isFlag = false;
                break;
            }
        }
        if (isFlag){
            System.out.println("很遗憾,没有找到!");
        }

        //二分法查找:特点->比较快
        //前提:所要查找的数组必须有序。
        int[] arr2 = new int[]{-96,-35,45,77,78,111,233,456};

        int dest1 = -32;
        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean isFlag1 = true;
        while (head <= end){
            int middle = (head + end)/2;
            if (dest1 == arr2[middle]){
                System.out.println("找到了指定的元素,位置为:" +
                        middle);
                isFlag1 = false;
                break;
            } else if (arr2[middle] > dest1) {
                end = middle - 1;
            }else {
                head = middle + 1;
            }
        }
        if (isFlag1){
            System.out.println("很遗憾,没有找到!");
        }

    }
}

  • 数组中的常见异常
    • 数组角标越界的异常:ArrayIndexOutOfBoundsException
    • 当角标在范围之外,则报错,且报错行以下不再执行
  • 空指针异常(多见):NullPointerException
package com.lurenj.java;
/*
*
* 数组中的常见异常
* 1.数组角标越界的异常:ArrayIndexOutOfBoundsException
*   当角标在范围之外,则报错,且报错行以下不再执行
*
* 2.空指针异常(多见):NullPointerException
*
* */
public class ArrayExceptionTest {
    public static void main(String[] args) {
        //数组角标越界的异常:ArrayIndexOutOfBoundsException
        int[] arr = new int[]{1,2,3,4,5};
        //越界1:右越界 当arr[i] i=5时,报错,实际角标为0~4
//        for (int i = 0; i <= arr.length; i++) {
//            System.out.println(arr[i]);
//        }
        //越界2:左越界,角标范围为0-4,报错,角标越界
        //System.out.println(arr[-2]);

        // 2.空指针异常(多见):NullPointerException
        //情况1:
//        int[] arr1 = new int[]{1,2,3};
//        arr1 = null;//相当于把arr1地址擦掉了,再次去找相当于空指针了
//        System.out.println(arr1[0]);

        //情况2:
//        int[][] arr2 = new int[4][];
//        System.out.println(arr2[0][0]);//空指针异常
        //情况3:
        String[] arr3 = new String[]{"AA","BB","CC"};
        arr3[0] = null;
        System.out.println(arr3[0].toString());//空指针异常


    }
}

posted @ 2023-06-30 16:56  Clayborne  阅读(20)  评论(0)    收藏  举报