【Java进阶学习 第九篇】常用API(Array、冒泡选择排序、二分查找、正则表达式)

发布于:2025-03-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

Array类常用方法

public static string tostring(类型[]a):将数组元素拼接为带有格式的字符串


public static boolean equals(类型[]a,类型[]b):比较两个数组内容是否相同

public static int binarySearch(int[] a,int key):査找元素在数组中的索引(二分査找法:保证数组的元素是排好序的

public static void sort(类型[]a):对数组进行默认升序排序

    public static void main(String[] args) {
        int[] arr1={11,22,33,44,55};
        int[] arr2={11,22,33,44,55};

        System.out.println(Arrays.toString(arr1));
        //[11, 22, 33, 44, 55]
        System.out.println(Arrays.equals(arr1, arr2));
        //true
        System.out.println(Arrays.binarySearch(arr1, 33));
        //2

        int[] arr3={33,11,22,55,44};
        System.out.println(Arrays.binarySearch(arr3, 44));
        //-4
        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3));
        //[11, 22, 33, 44, 55]
    }

注意,Array中的binarySearch方法只能针对已经排序好的数组,因为用的是二分查找法。


冒泡排序

相邻的两个元素进行比较,如果第一个元素比第二个元素大,就交换他们

    public static void main(String[] args) {
        int[] arr1={44,22,55,66,11,33};

        //外循环确定循环的次数
        for(int i=0; i<arr1.length-1; i++){
            //内循环确定每次循环比较的次数
            //arr.length-1防止数组索引越界
            //arr.length-1-i提高效率
            for(int j=0; j<arr1.length-i-1; j++){
                if(arr1[j]>arr1[j+1]){
                    int temp=arr1[j];
                    arr1[j]=arr1[j+1];
                    arr1[j+1]=temp;
                }
            }
        }

        System.out.println(Arrays.toString(arr1));
        //[11, 22, 33, 44, 55, 66]
    }
  • 由于每次循环结束,我们就确定了一个最大的数字,所以我们只需要循环arr.length-1次;
  • 为了每次循环的时候数组索引会出现越界现象,我们将内循环的arr.length-1;
  • 由于下一轮循环会比本次循环少比较一次,为了提高效率我们将内循环的条件定为arr.length-1-i;

选择排序

从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较

    public static void main(String[] args) {
        int[] arr1={44,22,55,66,11,33};

        //外循环确定循环轮数
        for(int i=0;i<arr1.length-1;i++){
            //内循环确定循环次数
            for(int j=i+1;j<arr1.length;j++){
                //j=1,2,3,4,5
                if(arr1[i]>arr1[j]){
                    int temp=arr1[i];
                    arr1[i]=arr1[j];
                    arr1[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr1));
        //[11, 22, 33, 44, 55, 66]
    }
  • 每次循环我们都会拿目前没确定顺序的第一个元素和后面所有元素一一对比,选出最小的和第一个元素交换顺序,所以每次循环会确定一个最小的数字,我们只需要循环arr.length-1次;
  • 每次循环未确定顺序第一个元素可以用arr[i]进行表示;
  • 最后一次循环i是4,j是5,只需要比较一次,所以j=i+1;

二分查找

前提:数组中的数据必须是排序好的

定义数组第一个元素和min和最后一个元素max,找到中间元素mid,通过比较目标数据和中间元素的大小,选择移动min还是max。

  • 目标元素大于中间元素:min=mid+1
  • 目标元素小于中间元素:max=mid-1
  • 如果正常二分查找到了目标数据那么:min<=max
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您想查找的数据:");
        int target=sc.nextInt();
        midSearch(arr,target);
    }

    private static void midSearch(int[] arr,int target) {
        int min=0;
        int max= arr.length-1;
        int mid;
        while(min<=max)
        {
            mid=(max+min)/2;
            if (target==arr[mid])
            {
                System.out.println("你想找的数字在数组中的索引为"+mid);
                return;
            } else if (target>arr[mid]) {
                min=mid+1;
            } else if (target<arr[mid]) {
                max=mid-1;
            }
        }
        System.out.println("数组中没有你想找的数据");
    }

正则表达式

本质来说就是一个字符串可以制定一些规则来校验其他字符串

[]表示单个字符,如"abc"和"[abc]":"abc"代表只能内容为abc的字符串能通过校验,而"[abc]"代表a,b,c三个单个字符都可以通过校验

字符类

[abc],[^abc]:除了abc之外的其他字符

        String regex1="abc";
        String regex2="[abc]";
        String regex3="[^abc]";

        System.out.println("a".matches(regex1));
        System.out.println("a".matches(regex2));
        System.out.println("0".matches(regex3));
//        false
//        true
//        true

[a-zA-Z0-9]范围联合:

        String regex4="[a-zA-Z0-9]";
        System.out.println("a".matches(regex4));
        System.out.println("B".matches(regex4));
        System.out.println("9".matches(regex4));
//        true
//        true
//        true

[a-z&&[^bc]]:a到c中除了b和c以外的其他字符


预定义字符类

  • .代表任意字符
  • \d代表一个数字
  • \D代表非数字
  • \w代表英文数字和下划线
        String regex5="\\d";
        String regex6="\\D";
        String regex7="..";
        String regex8="\\w";
        System.out.println("1".matches(regex5));
        System.out.println("B".matches(regex6));
        System.out.println("11".matches(regex7));
        System.out.println("_".matches(regex8));
//        true
//        true
//        true
//        true

数量

  • ?一次或0次 
  • *    任意次数
  • +一次或多次
  • {n}正好n次
  • {n, }至少n次
  • {n,m}至少n次但不超过m次

应用场景

QQ号正则

不能以0开头,全都是数字,5~12位

        String qqregex ="[1-9]\\d{4,11}";
        System.out.println("123456".matches(qqregex));
        System.out.println("12a456".matches(qqregex));
        System.out.println("023456".matches(qqregex));
        System.out.println("123456452354324".matches(qqregex));
//        true
//        false
//        false
//        false

其中[1-9]我们定义了第一个字符,后面只需要定义其他字符就可以,4到11位都是数字 


手机号正则

必须是1开头,第二位是3-9,全都是数字,必须是11位

        String phoneregex ="[1][3-9]\\d{9}";
        System.out.println("13888888888".matches(phoneregex));
        System.out.println("138888888".matches(phoneregex));
        System.out.println("23888888888".matches(phoneregex));
        System.out.println("11888888888".matches(phoneregex));
        System.out.println("1388fd88a888".matches(phoneregex));
//        true
//        false
//        false
//        false
//        false

邮箱正则

        String emailregex ="\\w+[@][\\w&&[^_]]+(\\.[a-z]{2,3})+";
        System.out.println("2312313@qq.com".matches(emailregex));
        System.out.println("12_aa@126.cn.com".matches(emailregex));
        System.out.println("12_aa@1_6.cn.com".matches(emailregex));
        System.out.println("12_aa@126.cncs.com".matches(emailregex));
//        true
//        true
//        false
//        false

替换方法

public string replaceAll(string regex,string newstr): 按照正则表达式匹配的内容进行替换

 我们可以将正则表达式regex封装为Pattern对象,通过pattern中的matcher方法,将我们要进行检验的字符串封装为匹配器Matcher对象,最终通过while语句,find一个字符再用group爬取一个字符

        String data ="来黑马程序员学习Java,"+
        "电话:18666668888,18699997777或者联系"+
                "邮箱:boniu@itcast.cn 邮箱:bozai@itcast.cn 邮箱2:dlei0009@163.com"
                +"座机电话:01036517895,010-98951256"
                +"热线电话:400-618-9090,400-618-400,400618400,4006189090";


        String regex="[1][3-9]\\d{9}|\\w+[@][\\w&&[^_]]+(\\.[a-z]{2,3})+|[0]\\d{2,3}[-]?\\d{7,8}|400-?\\d{3}-?\\d{3,4}";

        //将正则表达式封装为Pattern对象
        Pattern pattern = Pattern.compile(regex);

        //获取匹配器对象
        Matcher matcher = pattern.matcher(data);

        //通过匹配器从内容中爬取信息
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
//        18666668888
//        18699997777
//        boniu@itcast.cn
//        bozai@itcast.cn
//        dlei0009@163.com
//        01036517895
//        010-98951256
//        400-618-9090
//        400-618-400
//        400618400
//        4006189090