p153-158 Arrays工具类、几种常用排序、正则基本入门

p153 Arrays工具类

介绍:

数组操作工具类,专门用于操作数组元素。

常用方法:

toString(类型[] 数组名);将数组元素拼接为带有特定格式的字符串并返回。

equals(类型[] a , 类型[] b); 比较两个数组的内容是否相同。

sort(类型[] a); 对数组内容进行升序排序。有一个重载方法可以实现把内容降序排列,但是要用到一个现在看不明白的结构,所以这里先不说。

binarySearch(int[] a,int key);查找元素在数组中的索引(会使用二分查找法,所以如果数组没有排好序,返回的索引会是错误的),如果查找的元素在数组中不存在,则返回(-(插入点)-1),其中的插入点是指,如果查找的元素在数组中存在,那么根据排序,这个元素应该在的位置索引,比如数组是{11,22,33,44,55},在里面查找20,20按照数字排序应该在11和22中间,对应的索引是1,那么这里的插入点就是1,返回值是-1-1= -2 。也就是说,如果数组没排序,可能出现正数或者负数的错误的返回值,但是如果数组里没有这个要查找的数据,返回的一定是负数,并且返回的这个数值是它的插入点的负数再减一。

p154 冒泡排序

相邻的两个数比较,如果第一个比第二个大就交换。

拥有n个元素的数组,需要循环的轮数是n-1,每第i轮需要前后比较的次数是 n-1-i 次,每一轮都从0号索引位置开始进行比较到n-1-i号索引位置。

因为它每第i轮都能保证把数组中的前n-i+1个元素中的最大者一直交换到末尾,所以它才能每一轮比上一轮少比较一次。

示例:

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;
        }
    }
}

注意:多留心外循环和内循环的次数,外循环多了容易会越界异常,内循环多了会浪费时间。

p155 选择排序

从0索引开始,拿着每个索引的元素跟后面的元素依次比较,如果前者比后者大就把前者换给后者,然后用交换之后的0号索引位置的元素接着往后比,这样一轮之后,0号索引位置一定是数组里的最小元素;第二轮就跳过0号,直接从1号索引开始继续这个工作,一直到对比倒数第二个元素和最后一个元素。

拥有n个元素的数组,需要进行的轮数为n-1,每第i轮需要进行n-i次比较,并且是从i-1号索引位置开始比较到n-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 = arr[j];
            arr[j]=arr[i];
            arr[i]=temp;
        }
    }
}

p156 二分查找(折半查找)

前提:数组是一个有序数组(这里以从小到大为例)

首先定义两个边路,记录最小索引min和最大索引max(最开始是0和数组长度-1);

循环若干轮,循环条件是判断min是否小于等于max,只要符合就用min+max除以二计算出中间索引,用中间索引代表的元素和查找的元素进行比对:

如果等于就返回这个索引;

如果大于就代表要查找的元素可能在小的半部分,把中间索引-1之后赋值给max,进行下一轮循环;

如果小于就代表要查找的元素可能在大的半部分,把中间索引+1之后赋值给min,进行下一轮循环;

一直循环到找到这个元素为止,返回这个元素的索引,否则如果进行到min大于max,就代表这个数组里没有要查找的这个元素。

示例:

public static int binarySearch(int[] arr, int num){
    int min = 0;
    int max = arr.length-1;
    int mid;
    while(min<=max){
        mid=(min+max)/2;
        if(num==arr[mid]){
            return mid;
        }else if(num<arr[mid]){
            max = mid-1;
        }else if(num>arr[mid]){
            min = mid+1;
        }
    }
    return -1;
}

while循环保证一直在找到目标元素或者min>max也就是整个数组找完之前它会一直循环。

p157 正则表达式

正则表达式本质是一个字符串,可以在里面制定一些规则来校验其他字符串。

先瞟一眼

(什么玩意这都)

如何使用?

定义一个字符串,在字符串里编写规则,随后调用需要被校验的字符串的matches方法传入刚才定义的带有规则的字符串,最后会返回true或者false代表这串数据是否符合这个规则。

字符类

注:字符类的演示里有时候会有空格,如果没有标注的话空格是为了防止这个记笔记软件把内容改成奇怪的形式而加入的,回顾到这一段的话仔细判断一下哪些里有空格哪些里不该有空格

字符类的中括号代表这个中括号里的内容是针对判断单个字符的

[abc] 只能是a,b,或者c

[^abc] 可以是a,b,c以外的任意字符

[a-zA-Z] 可以是a-z和A-Z这两个范围的任意字符

[a-d[x-z]] 可以是a-d和x-z,与[a-dx-z]是同意义的,但是这样分隔开更易读,便于理解。能带上就带上。

[a-z&&[def]] 必须包含在a-z中且只能是a,b,或者c(就是只能是二者的交集范围)

[a-z&&[ ^abc]]必须包含在a-z中,除了a,b,或者c(交集,不过第二部分改了一下)(这里^abc左边实际应该没有空格)

[a-z&&[ ^c-g]]必须包含在a-z中,除了c-g(交集)(这里^c-g左边实际应该没有空格)

预定义字符类

就是一些写好了规则的字符类

字符串中的反斜杠 \ 的含义是把它后面的字符转化含义,例如\t类似于按下键盘上的tab键的效果,就可以理解为反斜杠把t转化成了这个效果。

转义字符后面可以跟上括号、引号之类的字符,效果是让这个字符作为字符而不是作为具有它的含义的内容存在,例如想在字符串里输入单个英文引号,编译器会将这个本应是内容的单引号理解成引号的后半部分,导致报错,在前面加上一个转义字符可以让它只是作为一个内容中的字符存在。

反斜杠转义反斜杠也有一样的效果,例如前面宝石迷阵游戏部分就是由反斜杠转义反斜杠,让它只作为一个路径分隔符存在于字符串中。在包含反斜杠的预定义字符类前面需要加上一个额外的反斜杠,以使得编译器能够把这个字符类理解成字符类而不是什么别的内容导致报错。

. 可以是任何字符

\d 一个数字[0-9]

\D 非数字[ ^0-9]

\s 空白字符(不止是空格,制表符之类的看着是空白但是有占用位置的字符好像也属于空白字符,但是没验证过具体有哪些字符属于空白)

\S 非空白字符

\w 包含英文、数字、下划线以内的字符(等效于[a-z[A-Z] [0-9]_](这里[0-9]左边实际应该没有空格)

\W 一个非单词字符,也就是除了英文、数字、下划线以外的字符

数量

X? X一次或0次

X* X零次或多次

X+ X一次或多次

X{n} X正好n次

X{n,} X至少n次

X{n,m} X至少n次至多m次(可以n次和m次)

这些玩意,凑一块,就是正则表达式了(啥啊

然后用被检验的字符串调用matches方法,给方法里传入这个正则表达式就可以获得这个字符串是否匹配这个规则的结果。

正则组

可以用小括号把一部分正则表达式括起来,然后这一部分可以作为一个整体使用上面数量部分的正则规则,括起来的这一部分就叫做正则组。

例如输入一大串字符是由若干个字符组成的,检测它是否匹配"字符数量是10的倍数"就可以使用正则组。

首先,检测一个字符串是否是由10个字符组成可以用这个表达式:

".{10}"

那么用这个表达式来组成"检测一个字符串是否由10的倍数个字符组成",就可以把上面的表达式作为一个正则组进行改动,改动后如下:

"(.{10})+"

不止这些,也可以用或(|)、与(&)对正则组进行连接,具体的含义就是被检验的字符串要至少满足一个(或)或者同时满足多个(与)正则表达式。

实际上上面介绍的这些部分也只是正则表达式编写规则的一部分,再具体的要私下去查找学习。

p158 使用正则做爬取

String类的两个成员方法:

replaceAll(String regex,String newStr); 按照正则表达式匹配的内容进行替换。

split(String regex); 按照正则表达式匹配的内容进行字符串的切割,返回一个字符串数组

Pattren类:

是一个专门表示正则表达式的类,它的成员方法:

compile(String regex); 把传入的正则表达式封装成一个Pattren类的对象;

matcher(CharSequence input); 传入数据源(包含数据的源字符串,并且内部的数据可以通过正则表达式检测出来)可以得到一个Matcher类型的匹配器对象,在匹配器对象中有专门用于爬取和获取的方法。

Matcher类:

由Pattren类使用matcher方法可以获得一个Matcher类的匹配器对象,它的成员方法:

find(); 返回一个布尔类型的结果,代表在Pattren类中调用matcher方法的这个字符串中有没有匹配那个Pattren类的正则表达式的内容,有就true否则false;

group(); 返回那个字符串中从前往后的第一个符合正则表达式的结果

**这两个方法必须结合起来使用才能用group方法返回出字符串里所有符合表达式的结果,find找一次,group返回一次,就返回一个结果,find两次group返回两次就返回第二个结果,以此类推。由此进行展开思考就发现,可以使用while循环来输出字符串里所有匹配的结果,代码示例如下:

System.out.println(matcher2.group());
while(matcher3.find()) {
    System.out.println(matcher3.group());
}

这段的效果是每当在字符串中找到一个符合要求的结果,就把他输出。在最开始和每一轮输出完一个结果之后进行find查找,如果剩下的字符串段落还有符合要求的结果,find方法返回为true,就会返回下一个结果,直到find方法返回false也就是余下的字符串里没有符合表达式的内容为止。

本章学习目标:

  • 能够运用Arrays类中操作数组的方法
  • 能够独立编写〔冒泡排序] [选择排序] [二分查找]
  • 能够独立编写出QQ正则,手机号正则,邮箱正则
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值