1、String与StringBuffer对比
功能 | String类 | StringBuffer类 |
---|---|---|
末尾添加任何类型数据 | 无 | append(…) |
插入任何类型数据 | 无 | insert(…) |
删除字符 | 无 | delete(…) deletecharAt(…) |
修改 | replace(…) replaceAll(…)replaceFirst(…) | replace(…) replaceAll(…) |
查找定位 | indexOf(…) lastIndexOf(…) | indexOf(…) lastIndexOf(…) |
长度 | length() | length() |
容量 | 无 | capacity() |
当前位置字符 | charAt() | charAt() |
取子串 | substring() | substring() |
结构分析(拆分) | split() | 无 |
结构分析(头部) | startsWith() | 无 |
结构分析(尾部) | endsWith() | 无 |
匹配 | matches() | 无 |
大小与相等比较 | equals() equalsIgnoreCase() compareTo() | 无 |
总结
String类做结构分析与字符串比较
StringBuffer类做增删
举例
/*删除下标为偶数的字符*/
//原始想法:
StringBuilder sb=new StringBuilder("汉字abc123");
for(int i=0;i<sb.length();i=i+2)
sb.deletecharAt(i);
System.out.println(""+sb);
//输出结果:
//字ac13
//分析:
/*结果错误
原因:删除一个字符后,其余字符会向前挪动*/
//改进方法:
//1、从右往左删除
...
for(int i=sb.length()-1;i>=0;i--){
if(i%2==0)
sb.deletecharAt(i);
}
...
//2、还是从左往右删除
...
for(int i=0;i<sb.length();i++){
sb.deletecharAt(i);
}
...
2、Random类
使用java.util.Random包,Random构造器可带种子也可不带种子。
方法 | 描述 |
---|---|
nextInt() | 返回下一个int类型的伪随机数,值在最大值与最小值之间 |
nextInt(int n) | 返回下一个int类型的伪随机数,值在0-n之间 |
nextLong() | 返回下一个long类型伪随机数,同上 |
nextDouble() | … |
nextBoolean() | …,值为true或false |
//随机产生0-100的数
Random r=new Random();
for(int i=1;i<=10;i++)
System.out.print(" "+r.nextInt(100));
3、数据结构包
ArrayList类
//十进制数转换为二进制数
ArrayList<Integer> al=new ArrayList<Integer>();//<>里面是数据类型的包装类
int n=128;
do{
al.add(n%2);
n/=2;
}while(n!=0);
for(int i=al.size()-1;i>=0;i--)
System.out.print(" "+al.get(i));
HashMap类
构造器:
…
HashMap(int initialCapacity,float loadFactor)//容量,装填因子
装填因子=已有元素/总容量:默认为0.75,若高于装填因子,则自动扩充容量
//频度统计
String ds="汉字汉字我我我计算机计";
HashMap<Character,Integer> hm=new HashMap<Character,Integer>();
for(int i=0;i<ds.length();i++){
char c=ds.charAt(i);
int v=0;
hm.put(c,hm.get(c)==null?1:hm.get(c)+1);
}
System.out.print(" "+hm);//hm的toString已经定义:key+value
4、正则表达式
变量名取法:以字母开头,由字母,数字,下划线组成的串。这个就是用汉语描述的正则式。
特殊字符 | 描述 |
---|---|
[abc] | a、b、c中的任意一个字符 |
[^abc] | 除了a、b、c中的任意一个字符(否定) |
[a-zA-Z] | a-z或A-Z的任意字符(范围) |
\s | 空白符 |
\S | 非空白符 |
\d | 数字 |
\D | 非数字 |
\w | 单词字符 |
. | 任意一个字符 |
\ | 反斜线字符\ |
\uhhhh | 十六进制表示的unicode值为hhhh的字符 |
x* | 0个或多个x(最大匹配) |
x+ | 一个活多个x(最大匹配) |
x? | 0个或一个x(最大匹配) |
x(n) | 恰好n个x |
x(n,) | 至少n个x |
x(n,m) | 至少n个x,不多于m个x |
x*? | 0个或多个x(最小匹配) |
x+? | 1个或多个x(最小匹配) |
x?? | 0个或1个x(最小匹配) |
xy | x后跟y |
x|y | x或y |
(x) | 定义补货组 |
\n | 与第n个捕获组相匹配的字串 |
java中表示正则规则:\ 加倍
举例:
1、要求:串"x_y"_中是abc中的任意一个
x[abc]y
System.out.print("xay".matches("x[abc]y"));
//结果:true
//表示该字符串满足该正则表达式
2、一个数字:正则式:\d java中表示:"\\d"
数字集(可空):正则式:\d* java中表示"\\d*"
数字集(不空):\d+ “\\d+”
1-4个的字串 \d{1,4} “\\d{1,4}”
3、IP地址:192.16.5.170如何用正则表达式表示
首先在结构上数字+.出现了三次表示:(\d{1,3}\.){3}
最后加上1-3个数字:(\d{1,3}\.){3}\d{1,3}
java中表示(\加倍):
"(\\d{1,3}\\.){3}\\d{1,3}"
4、常见串:
//一个汉字:
[\u4e00-\u9fa5]
//汉字串:
[\u4e00-\u9fa5]+
//一个英文字符
[a-zA-Z]
//英文单词
[a-zA-Z]+
5、对空格进行拆分:
String s="copy a.txt b.txt"
String[] ss=s.split("\\s+");
for(String e:ss)//元素类型 取变量名: 数组名
{
System.out.println(e);
}//防止出现数组下标越界
//结果:
copy
a.txt
b.txt
6、提取所有数字串
String s="45s5dasdasd58aw8ea";
String ss[]=s.split("[^0-9]+");//非数字组成的串起分割作用
...
7、最大匹配与最小匹配:
a*b
中间部分尽可能大
a*?b
中间部分尽可能小
对于串accccbbbbbb:
a*b:a与第一个a匹配,b与组后一个b匹配
a*?b:a与最后一个a匹配,b与第一个b匹配
8、组:
((x)(y)):从左往右,左括号分别为1、2、3号组
举例:写一个表示重复的正则式
//aaaaaa怎么表示
//首先对于任意一个字符一号组表示:(.)
//后面跟与一号组相配的字符表示:(.)\1
//重复任意次:(.)\1*
String s="aaaabbbb111";
s.replaceAll("(.)(\\1)*","$1");//正则式,替换串,$1是replaceAll特别规定的
位置相配:
(?=X):这个位置的右边都能匹配X。
(?!X):这个位置的右边都与X不匹配。
(?<=X):这个位置的左边都能匹配X。
(?<!X):这个位置的左边都与X不匹配。
\G:上一次匹配的结束位置
^:行开头匹配
$:行结束匹配
举例:
1、^a$:这一行仅有a
2、位置拆分:
/*对于一个串aaabbbcccdddeeeff,将串每三个一组拆分成:
aaa
bbb
ccc
ddd
eee
ff
对于某个位置,他的上一个位置的左边存在三个字符
(?<=\G.{3})
*/
正则类
Pattern类:
每一个类对象就是一个正则表达式,(即将正则表达式的String转换为更高效的内部模式叫做Pattern)
这个类的构造器无法调用,所以调用工厂方法,将正则表达式转换为Pattern对象。
Matcher类:
称为状态机对象
appendReplacement(StringBuffer sb,String replacement)
appendTail(StringBuffer sb)
综合举例:
1、将字符串中的整数提取出来
String s="asd8wd5+fdfd50asd(dasd56+a)";
Pattern p=Pattern.compile("//d+");
Matcher m=p.matcher(s);//从数据源s中每次匹配上述正则式
while(m.find())//find()开始从s中搜索匹配
{
String rs=m.group();//将找到的匹配作为组提取
System.out.println(" "+rs);
}
2、提取英文单词,仅仅需要改边正则式即可
...
Pattern p=Pattern.compile("[a-zA-Z]+");
...
3、提取英文单词或数字
Pattern p=Pattern.compile("[a-zA-Z]+|\\d+");//字母串或者数字串
4、设计一个Java程序,完成: 给出一种物质的分子式(不带括号),求分子量。
本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。
输入界面:
请输入分子式:C6H5OH
输出界面:
分子式:C6H5OH 的分子量为94.108g/mol。
/*首先考虑分子式结构:是由(x,y)形式重复组成的,其中x是C,H,O,N组成的,y是数值
所以分子式结构是:([CHONchon]\d*)+,输入要判断是否满足该结构式,不满足则报错。
其次,C,H,O,N 与其分子量采用HashMap存储*/
private static HashMap<String,Double> map=new HashMap<String,Double>();
static{
map.put("C",12.01);
map.put("H",1.008);
map.put("O",16.00);
map.put("N",14.01);
}//静态初始化块
public static double cal(String s){
Pattern p=Pattern.compile("([CHONchon])(\\d*)");
Matcher m=p.matcher(s);
double mw=0;
while(m.find())
{
String g1=m.group(1);//x
String g2=m.group(2);//y
double dg1=map.get(g1.toUpperCase().trim());//toUpperCaseg1转成大写,trim()去掉可能存在的空格
int n=1;
try{
n=Integer.parseInt(g2);//转为整型
}catch(Exception e){
n=1;
}//异常捕获
mw=mw+dg1*n;
}
return mw;
}
5、模板引擎处理,设计模板
pubilc class Template{
static HashMap<String,String> map=new HashMap<String,String>();
static{
map.put("name","王平");
map.put("age","32");
map.put("city","南京");
}
public static void main(String [] args)
{
String temp="欢迎${name}来到${city}!";
Pattern p=Pattern.compile("\\$\\{\\s*([a-zA-Z]+)\\s*\\}");
StringBuffer sb=new StringBuffer();
Matcher m=p.matcher(temp);
while(m.find())
{
m.appendReplacement(sb,map.get(m.group(1)) );//第一次循环sb中存储 欢迎王平
}
m.appendTail(sb);//感叹号不能少
System.out.println(" "+sb.toString());
}
}