常用API学习(四):Arrays工具类(冒泡排序、二分查找)和正则表达式。

文章详细介绍了Java中的Arrays工具类,包括toString(),copyOfRange(),copyOf()和sort()等方法的使用。接着讨论了自定义排序,特别是通过Comparator接口实现对象排序的原理和示例。此外,还讲解了冒泡排序及其优化以及二分查找算法。最后,提到了正则表达式在Java中的应用,展示了如何使用matches()方法验证手机号和座机号格式。
摘要由CSDN通过智能技术生成

一. API-Arrays工具类

1. Arrays类

概述:数组操作工具类,专门用于操作数组元素的。

Arrays工具类常用方法:
在这里插入图片描述
示例代码:

public class ArraysDemo {
    public static void main(String[] args) {
        //定义一个整型数组int[] arr;
        int[] arr = {11, 2, 6, 5, 65, 65, 65, 62};
        //1.Arrays.toString()打印数组,返回数组的字符串
        System.out.println(Arrays.toString(arr));
        //2.Arrays.copyOfRange()截取数组指定的索引位置,索引包前不包后
        int[] newArr = Arrays.copyOfRange(arr, 1, 4);
        System.out.println(Arrays.toString(newArr));
        //3.Arrays.copyOf(),拷贝指定长度的数组
        int[] newArr1 = Arrays.copyOf(arr, 4);
        System.out.println(Arrays.toString(newArr1));
        //4. Arrays.sort(arr),数组排序,默认升序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:
在这里插入图片描述

2. Arrays类的排序方法(重要)

在这里插入图片描述

自定义排序的方法:

3. Comparator排序接口的使用(重要)

根据实际的需求自定义排序。

Comparator接口的核心方法是compare方法。

格式:

int compare(T obj1,T obj2);

该方法接受两个参数,表示需要比较的两个对象,返回一个整数值,表示 obj1 和 obj2 的大小关系。该方法的返回值有以下规则:

  • 如果 obj1 小于 obj2,则返回负整数;
  • 如果 obj1 等于 obj2,则返回 0;
  • 如果 obj1 大于 obj2,则返回正整数。

使用 Comparator 接口,可以自定义对象之间的比较规则。常见的应用场景有:

  1. 对象排序:可以通过实现 Comparator 接口的 compare 方法,定义对象的比较规则,然后通过调用 Arrays.sort() 或 Collections.sort() 方法来对对象进行排序。
  2. TreeSet 和 TreeMap:这两个集合类是基于红黑树实现的,它们默认按照对象的自然顺序进行排序。但是,如果对象没有实现 Comparable 接口,或者希望按照其他比较规则进行排序,可以使用 Comparator 接口来指定排序规则。

使用 Comparator 接口进行对象排序的示例代码:

public class ArraysStudentTest {
    public static void main(String[] args) {
        Student[] students = new Student[5];
        students[0] = new Student("小敏", 18, 100, 100, 100);
        students[1] = new Student("小红", 19, 36, 36, 99);
        students[2] = new Student("小名", 17, 98, 55, 99);
        students[3] = new Student("小军", 22, 67, 45, 89);
        students[4] = new Student("小狗", 20, 55, 100, 99);
        //使用匿名内部类
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i]);
        }
    }
}

4. 冒泡排序

在这里插入图片描述

示例代码:

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {11, 5, 13, 2};
        //冒泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:

在这里插入图片描述

弊端:这种冒泡排序是考虑极端坏的情况下,算法进行比较浪费资源。

5. 优化冒泡排序(重要)

优化思想:通过记录内层排序交换是否进行,可以判断出排序是否完成。

示例代码:

//优化冒泡排序
        Random random = new Random();
        int[] brr = new int[20];
        //循环给数组随机生成20个0~100之间数据
        for (int i = 0; i < brr.length; i++) {
            brr[i] = random.nextInt(100);
        }
        //优化排序
        for (int i = 0; i < brr.length - 1; i++) {
            //定义一个变量stare记录内层判断是否执行,每次默认已经排序完成true,当排序没完成是改变state的值为false。
            boolean state = true;
            for (int j = 0; j < brr.length - 1 - i; j++) {
                if (brr[j] > brr[j + 1]) {
                    int temp = brr[j];
                    brr[j] = brr[j + 1];
                    brr[j + 1] = temp;
                    //当内层循环判断执行时证明排序未完成,改变state的值为false.
                    state = false;
                }
            }
            //当state的值一直是true时,证明数组已经排序完成结束循环排序。
            if (state) {
                break;
            }
            System.out.println("第" + i + "轮排序:" + Arrays.toString(brr));
        }

6. 二分查找

二分查找的前提必须是数组有序。

代码示例:

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {25, 36, 69, 78, 99, 102, 369};
        System.out.println(binarySearch(arr, 102));
        System.out.println(binarySearch(arr, 106));
        System.out.println(binarySearch(arr, 69));
    }

    //二分查找法:arr(查询的数组) target:查询的数据
    public static int binarySearch(int[] arr, int target) {
        //声明左右指针(限制查询的范围)
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int middle = (right + left) / 2;
            if (arr[middle] == target) {
                return middle;//如果中间索引元素就是目标元素,则middle就是目标元素的索引。
            } else if (target > arr[middle]) {
                left = middle + 1;//如果target在中间元素的右边,则挪动左指针变为中间指针+1.
            } else {
                right = middle - 1;//如果target在中间元素的左边,则挪动右指针变为中间指针-1.
            }
        }
        return -1;//如果while循环结束就说明目标元素不在数组中,则返回-1.
    }
}

二. 正则表达式(重要)

概述:就是由一些特定的字符组成,代表的是一个规则。

String提供了一个匹配正则表达式的方法:

//判断字符串是否符合正则表达式,匹配返回true,不匹配返回false。
public boolean matches(String regex)

正则表达式的书写规则:

1. 字符类(只能匹配单个字符)

在这里插入图片描述

2. 预定义字符(只能匹配单个字符)

在这里插入图片描述

注意:在java中“\”有特殊含义,在java中需要编写两个“\”告诉虚拟机没有特殊含义,不需要转义。

3. 数量词

在这里插入图片描述

代码示例:

public static void checkMobileNumber(String mobileNumber) {
    /*
    分析:手机号码范例【13833348009】【17710327783】
       (1)手机号总长11位,手机号码的第一位一定是1 => [1]
       (2)根据现行手机号规范要求,第二位的范围在3-9之间 => [3-9]
       (3)剩余的9位必须是数字而且必须是9位 \\d{9}
    */
    String mobileNumberRegex = "[1][3-9]\\d{9}";
    System.out.println("手机号码【" + mobileNumber + "】是否符合要求:" + mobileNumber.matches(mobileNumberRegex));
}

public static void checkPhoneNumber(String phoneNumber) {
    /*
    分析:座机号码范例【010-12345】【0313-3067865】【021-3878263】【010123456】
        (1)区号可以三位也可以为四位必须是数字,第一位必须是0 [0]\\d{2,3}
        (2)区号与座机号中的-可以有也没有 [-]?
        (3)座机号可以最少5位最多8位 \\d{5,8}
     */
    String phoneNumberRegex = "[0]\\d{2,3}[-]?\\d{5,8}";
    System.out.println("手机号码【" + phoneNumber + "】是否符合要求:" + phoneNumber.matches(phoneNumberRegex));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值