oo_project_1
Project 1题目要求分析:
实现多项式的加减运算,主要问题是解决输入格式的判断问题。
输入实例:
{(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3),(10,7)}
{}表示多项式,其中的小括号第一个参数是系数,第二个是指数。同一个多项式指数要求不同。
程序实现的重点总结
1.去除空白字符
s = s.replaceAll("\\s*", "");
2.初步判断合法性(有有效输入字符且没有中文)
Pattern p = Pattern.compile("[\u4e00-\u9fa5]+"); //匹配中文字符
Matcher m = p.matcher(s);
if (s.trim().isEmpty()) { //判断是不是空串,或者字符串只由空白字符组成。trim方法去除字符串前后的空白字符
System.out.println("ERROR");
System.out.println("#The string is empty!");
}
else if(m.find()){
System.out.println("ERROR");
System.out.println("#The string has Chinese character!");
}
3.多项式格式检查
public static boolean CheckSyntax(String s){
String str;
if(s.charAt(0) != '-' && s.charAt(0) != '+'){
str = '+' + s;
}
else{
str = s;
} //如果第一个多项式前面没有符号,添加+,以方便匹配
Pattern p1 = Pattern.compile("([+-]\\{[^\\}]+}){0,20}");
Matcher m1 = p1.matcher(str);
boolean flag = m1.matches(); //先进行整体检查(逻辑清晰,且不会爆栈),匹配整体是否为+{...}-{...}格式,match方法要完全匹配才返回true
if(flag){
Pattern p2 = Pattern.compile("(\\{[^\\}]+})");
Matcher m2 = p2.matcher(str); //外部多项式大括号匹配成功,再进一步看大括号里面的是否符合格式
Pattern p3 = Pattern.compile("\\{\\([+-]?\\d{1,6},([+]?\\d{1,6}|-0{1,6})\\)(,\\([+-]?\\d{1,6},([+]?\\d{1,6}|-0{1,6})\\)){0,49}\\}");
while(m2.find()){ //匹配大括号里面的(c, n),(c,n)...
Matcher m3 = p3.matcher(m2.group(1));
if(m3.matches() == false){
return false;
}
}
return true;
}
else{
return false;
}
}
注意:
正则表达式的具体含义请参考后面的博客
不支持空多项式,{}会被报错。
3.字符串中数字的提取以及符号的提取
因为前面已经做过格式检查,如果格式是对的,只要非贪婪式匹配(...,就能提取系数,匹配,...)就能提取指数。(?表示非贪婪匹配)
同理,匹配{前面的字符就能得到运算符。
正则表达式的提取数字过程如下:
Pattern p = Pattern.compile("(?<=\\{)(.*?)(?=\\})");
Matcher matcher = p.matcher(s);
while(matcher.find()){
list.add(matcher.group());
} //提取每个{}多项式里面的内容并放进list容器里面
Pattern p1 = Pattern.compile("(?<=\\()([\\+|\\-]?[0-9]*?)(?=\\,)");
Matcher m1 = p1.matcher(str); //匹配系数
Pattern p2 = Pattern.compile("(?<=\\,)([\\+|\\-]?[0-9]*?)(?=\\))");
Matcher m2 = p2.matcher(str); //匹配指数
将字符串转化为数字:
int c = Integer.parseInt(m1.group());
int d = Integer.parseInt(m2.group());
注意,当parseInt方法不能转化字符换为整数的时候会抛出异常,最好使用try+catch方法对异常进行捕捉,以方便debug和避免程序的crash。
附:异常处理
异常处理的具体方法见后面的博客总结。
try{
... ...
}catch(IOException e){
//处理IO异常的代码
}catch(NumberFormatException e){
//处理parseInt不能转换时的异常代码
}catch(StringIndexOutOfBoundsException e){
//处理数组越界的异常代码
}catch(Exception e) {
//总异常(父类)
}
正则表达式匹配运算符:
Pattern p = Pattern.compile("([\\+|\\-])(?=\\{)");
Matcher matcher = p.matcher(str);
当然,也可以使用split方法提取,会更加简洁。
抽到的测试程序
第一次抽到同学的代码整体写的不错,除了正则表达式爆栈了有点小遗憾。里面有很多值得学习的地方。
1.程序的结束与退出
System.exit(0); //程序结束,相当于C语言的return 0;正常结束时程序exitcode == 0。
System是一个Java类,调用exit(0)方法终止虚拟机也就是退出你的Java程序,括号里面的是参数,进程结束的返回值。
2.正则表达式太长,在数据压力大的时候可能会爆栈
public void formatCheck() {//正则表达式匹配格式
String regex = "[+-]{0,1}\\{{1}\\({1}[+-]{0,1}[0-9]{1,6},{1}((\\+{0,1}[0-9]{1,6})|(-{1}0{1,6}))\\){1}(,{1}\\({1}[+-]{0,1}[0-9]{1,6},{1}((\\+{0,1}[0-9]{1,6})|(-{1}0{1,6}))\\){1}){0,}\\}{1}([+-]{1}\\{{1}\\({1}[+-]{0,1}[0-9]{1,6},{1}((\\+{0,1}[0-9]{1,6})|(-{1}0{1,6}))\\){1}(,{1}\\({1}[+-]{0,1}[0-9]{1,6},{1}((\\+{0,1}[0-9]{1,6})|(-{1}0{1,6}))\\){1}){0,}\\}{1}){0,}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
if(m.matches() == false && input.length() != 0) {
System.out.println("ERROR");
System.out.println("#输入格式错误");
System.exit(0);
}
}
oo_project_1的更多相关文章
随机推荐
- SpringMvc和Mybatis整合需要配置的xml
applicationContext-dao.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...
- Java-多线程第一篇多线程相关认识(1)
1.单线程进程 如果程序执行某行代码时遇到了阻塞,则程序将会停滞在该处. 2.进程代表着一个程序,程序是静态的,进程是动态的程序. 进程是系统进行资源分配和调度的一个独立单位.关于进程有如下3个特征: ...
- mysql中列转行
通过group_concat()函数来实现 select group_concat(name) from table group by type select group_concat(name se ...
- [Bzoj1009][HNOI2008]GT考试(动态规划)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 显而易见的动态规划加矩阵快速幂,不过转移方程不怎么好想,dp[i][j]表示长度为 ...
- 702:Crossing River (贪心)
[题目描述] N个人过河,一次过去2个回来一个,给出每个人所需时间,问最小过河时间. [题目链接] http://noi.openjudge.cn/ch0406/702/ [算法] 一开始想样例是怎么 ...
- python学习第十八天计算机字符编码
人类语言和计算机语言二进制怎么沟通,最开始字符编码为ascii码对照表 包括数据和字母,没有汉字,中国自己搞了一套自己的编码 gb2312编码后来发展GBK编码,日本,韩国都,甚至台湾也搞自己的编码, ...
- SELECT COUNT语句
数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更 ...
- Python_pickle
pickle是一个可以将任意一个对象存储在硬盘文件中的工具. 更新:Python3中用法变了: https://www.cnblogs.com/fmgao-technology/p/9078918. ...
- 安卓构架组件——向项目添加组件(Adding Components to your Project)
在开始之前,建议阅读 应用架构指南. Before getting started, we recommend reading the Architecture Components Guide to ...
- win10开机出现两个系统
1.cmd(Ctrl+R) 2.输入msconfig 3.选引导 4.删除多余的系统(切记不能删错)