day14(①正则表达式②Arrays类③常见算法④Lambda表达式)

目录

一:正则表达式(regex)                java.util.regex.pattern

1.概念,方法:

2.校验规则:

3.常见案例:

4.正则表达式在方法中的应用:

5.正则表达式爬取信息

二:Arrays类                                                java.util.Arrays

1.概述和常用API:

2.  Comparator比较器(自定义排序规则)

三:常见算法

1.选择排序:

 2.二分选择查找:

四:Lambda表达式

1.概述和基本使用

2.  实战-简化常见函数式接口

3. Lambda表达式的省略规则


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

一:正则表达式(regex)                java.util.regex.pattern

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

1.概念,方法:

                概述:正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性

              ·  方法:  字符串对象提供了匹配正则表达式的方法, 判断是否匹配正则表达式,匹配返回true,不匹配返回                                     public boolean matches​(String regex):

2.校验规则:

字符类(默认匹配一个字符)
[abc] 只能是a, b, 或c
[^abc] 除了a, b, c之外的任何字符
[a-zA-Z]   a到z A到Z,包括(范围)
[a-d[m-p]]a到d,或m通过p:([a-dm-p]联合)
[a-z&&[def]]d, e, 或f(交集)
[a-z&&[^bc]] a到z,除了b和c:([ad-z]减法)
[a-z&&[^m-p]] a到z,除了m到p:([a-lq-z]减法)

预定义的字符类(默认匹配一个字符)
.    任何字符
\d     一个数字: [0-9]
\D  非数字: [^0-9]
 \s  一个空白字符: [ \t\n\x0B\f\r]
\S非空白字符: [^\s]
\w     [a-zA-Z_0-9] 英文、数字、下划线
 \W     [^\w] 一个非单词字符

贪婪的量词(配合匹配多个字符)
X?X , 一次或根本不
X*X,零次或多次
X+X , 一次或多次
X { n }X,正好n次        
X  { n,  }X,至少n次
X {n,m}X,至少n但不超过m次

3.常见案例:

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您注册的手机号:");
        String format = sc.next();
        //1. 手机号码

        if (format.matches("1[3-9]\\d{9}")) {      }

        //2. 邮箱号码
        /*    判断邮箱格式是否正确    3268847878@qq.com
             判断邮箱格式是否正确     3268847dsda878@163.com
             判断邮箱格式是否正确     3268847dsda878@pci.com.cn*/

        if (format.matches("\\d{1,12}@[a-zA-Z0-9]{2,3}(\\.[a-zA-Z0-9]{2,3}){1,2}")) {   }

        //3. 座机号码  判断座机式是否正确   027-3572457  0273572457

        if (format.matches("0\\d{2,5}\\-?\\d{6,10}"));

        
        //4. 金额格式   99  0.5  99.5  019  √    0.3.3 ×
           
            if (money.matches("0?\\d{1,20}| 0\\.\\d{1,2}|0?\\d{1,20}\\.\\d{1,2}"))
        
    }

4.正则表达式在方法中的应用:

方法名

说明

 public String replaceAll(String regex,String newStr)

按照正则表达式匹配的内容进行替换

public String[] split(String regex):

按正则表达式规则分割字符串,返回一个字符串数组。

public static void main(String[] args) {
        String names = "库里dhdfhdf342麦科勒姆43fdffdfbjdfaf特雷杨";

        String[] arrs=names.split("\\w+");
        for (int i = 0; i < arrs.length; i++) {
            System.out.println(arrs[i]);
        }

        String name22=names.replaceAll("\\w+","  ");
        System.out.println(name22);
    }

5.正则表达式爬取信息

 // 需求:从上面的内容中爬取出 电话号码和邮箱。
    public static void main(String[] args) {
        String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
                "itcast@itcast.cn,电话18762832633,0203232323" +
                "邮箱bozai@itcast.cn,400-100-3233 ,4001003232";
        
        // 1、定义爬取规则,字符串形式
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})" +
                "|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";

        // 2、把这个爬取规则编译成匹配对象。
        Pattern  pat=Pattern.compile(regex);
        
        // 3、得到一个内容匹配器对象
        Matcher mat= pat.matcher(rs);

        // 4、开始找了
        while (matcher.find()) {
            String rs1 = matcher.group();
            System.out.println(rs1);
        }
    }  

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

二:Arrays类                                                java.util.Arrays

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

1.概述和常用API:

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

                      

Arrays类的常用API

方法名

说明

public static String toString​(类型[] a)

返回数组的内容(字符串形式)

public static void sort​(类型[] a)

对数组进行默认升序排序

public static <T> void sort​(类型[] a, Comparator<? super T> c)

使用比较器对象自定义排序

public static int binarySearch​(int[] a, int key)

二分搜索数组中的数据,存在返回索引,不存在返回-1

  public static void main(String[] args) {
        int[] arr = {10, 40, 20, 30};
        
        // 1、返回数组内容的 toString(数组)
        String rs = Arrays.toString(arr);
        System.out.println(rs);
        
        // 2、排序的API(默认自动对数组元素进行升序排序)
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        
        // 3、二分搜索技术(前提数组必须排好序才支持,否则出bug)
        int index = Arrays.binarySearch(arr, 30);
        System.out.println(index);
        
        // 返回不存在元素的规律: - (应该插入的位置索引 + 1)
        int index2 = Arrays.binarySearch(arr, 25);
        System.out.println(index2);
    }

2.  Comparator比较器(自定义排序规则)

public   static   <T>  void   sort  ​(  类型[  ] a,   Comparator<? super T> c)

使用比较器对象自定义排序

设置Comparator接口对应的比较器对象,来定制比较规则。
如果认为左边数据 大于 右边数据返回正整数
如果认为左边数据 小于 右边数据 返回负整数
如果认为左边数据  等于 右边数据 返回0

 public static void main(String[] args) {

        // stude是创建的类,这里不方便展示,student中重写了toString方法
        //需求:降序排序!(自定义比较器对象,只能支持引用类型的排序!!)
        student[] arrs = new student[3];
        arrs[0] = new student("库里", 20, 191.2);
        arrs[1] = new student("汤普森", 30, 195.9);
        arrs[2] = new student("格林", 28, 198.2);

        //排序前打印,需要在子类中重写toString方法
        System.out.println(Arrays.toString(arrs));
        
        /*
           参数一:被排序的数组 必须是引用类型的元素
           参数二:匿名内部类对象,代表了一个比较器对象。
        */
        Arrays.sort(arrs, new Comparator<student>() {
            @Override
            public int compare(student o1, student o2) {
                //自己指定规则
                return -(o1.getAge() - o2.getAge());//升序
                 /*return -(o1.getAge() - o2.getAge());  降序
                如果这里比较浮点型,需要调用 compare API
                return Double.compare(o1.getHeight(), o2.getHeight());*/
            }
        });

        System.out.println(Arrays.toString(arrs));//排序后打印
    }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

三:常见算法

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

1.选择排序:

1

public static void main(String[] args) {

        Integer[] arr = {5, 1, 3, 2, 10, 9, 30};

        //定义一个循环控制选择几轮: arr.length - 1
        for (int i = 0; i < arr.length - 1; i++) 
        {
            // 定义内部循环,控制选择几次
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp;
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp; } } 
        }
        System.out.println(Arrays.toString(arr));
    }

 2.二分选择查找:

    public static int binarySearch(int[] arr, int data){
        // 1、定义左边位置  和 右边位置
        int left = 0;
        int right = arr.length - 1;

        // 2、开始循环,折半查询。
        while (left <= right){
            // 取中间索引
            int middleIndex = (left + right) / 2;
            // 3、判断当前中间位置的元素和要找的元素的大小情况
            if(data > arr[middleIndex]) {
                // 往右边找,左位置更新为 = 中间索引+1
                left = middleIndex + 1;
            }else if(data < arr[middleIndex]) {
                // 往左边找,右边位置 = 中间索引 - 1
                right = middleIndex - 1;
            }else {
                return middleIndex;
            }
        }
        return -1; // 查无此元素
    }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

四:Lambda表达式

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

1.概述和基本使用

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

        //1.标准匿名内部类
        swimmg s = new swimmg() {
            @Override
            public void run() {
                System.out.println("库里跑的很快~");
            }
        };//go(s);


        //2.初步简化
        swimmg s1 = () -> {
            System.out.println("汤普森跑的很快~~");
        };   //go(s1);

        //3. 最终简化
        go(() -> {
            System.out.println("格林跑的很快~~");
        });

    }

    public static void go(swimmg s) {
        System.out.println("开始~");
        s.run();
        System.out.println("结束~");
    }

    @FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
    abstract interface swimmg {
        public abstract void run();
    }
}

2.  实战-简化常见函数式接口

package Test;

import java.util.Arrays;
import java.util.Comparator;

   //简化  compare 自定义排序规则

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

        Integer[] ages1 = {34, 12, 42, 23};
        //第一步
        Arrays.sort(ages1, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1; //  降序
            }
        });

        //第二步
        Arrays.sort(ages1, (Integer o1, Integer o2) -> {
            return o2 - o1; //  降序
        });

        //第三步
        Arrays.sort(ages1, (o1, o2) -> {
            return o2 - o1;
        });

        //第四步
        Arrays.sort(ages1, (o1, o2) -> o2 - o1);

    }
}

3. Lambda表达式的省略规则

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值