目录
一:正则表达式(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.概念,方法:
用一些规定的字符来制定规则,并用来校验数据格式的合法性。
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 | 使用比较器对象自定义排序 |
设置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);
}
}