(1)前言:
不同于大一上的c语言的PTA作业,java的PTA作业越来越贴近生活中的需求,难度也越来越大了,代码的设计量和题目考察的知识点也是.最后一次作业没有给测试样例,导致有几个点没过,不知道错哪了,测不出来,非常的难受.
这次作业使用了ArryList
先了解下ArryList
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。
1.ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
代码如下(示例):
import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName =new ArrayList<>(); // 初始化
E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
objectName: 对象名
ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。
如果我们要存储其他类型,而
基本类型对应的包装类表如下:
Java ArrayList 常用方法列表如下:
(2)设计与分析:
这次新加的连续题目集,家庭电路,思路非常的简单,但是其中的计算有些难搞.(头大)
题目的设计图老师给了
设计建议:
1、电路设备类:描述所有电路设备的公共特征。
2、受控设备类、控制设备类:对应受控、控制设备
3、串联电路类:一条由多个电路设备构成的串联电路,也看成是一个独立的电路设备
其他类以及类的属性、方法自行设计。
就照着老师给的照搬了下来,省事嘿嘿.(-)
一开始看到题目说把串联电路类看成是一个独立的电路设备时都懵了,不知道啥意思,后向想了想后面要遍历串并联电路才好做,所以要把它看成一个特殊的电路设备.
输入:
题目给的样例是这样的
这让我想起了上次大作业的答题的输入,所以我选择了通过正则表达式来获取输入信息
String regStr = "(([\\w])[\\d])\\-1";String regStr1="(T[\\d])";String regStr2 = "(([\\w])[\\d])\\-IN";Pattern pattern = Pattern.compile(regStr);Pattern pattern1 = Pattern.compile(regStr1);Pattern pattern2 = Pattern.compile(regStr2);Matcher matcher = pattern.matcher(str);Matcher matcher1 = pattern1.matcher(str);Matcher matcher2 = pattern2.matcher(str);if(matcher1.find()){seriesCircuits1.setName(matcher1.group());
获取完信息后,我才用ArryList将一个个数据储存
while (matcher.find()){if (matcher.group(2).compareTo("K") == 0) {K k = new K();k.setName(matcher.group(1));equipment1.add(k);equipment.add(k);}if (matcher.group(2).compareTo("F") == 0) {F f = new F();f.setName(matcher.group(1));equipment1.add(f);equipment.add(f);}if (matcher.group(2).compareTo("L") == 0) {L l = new L();l.setName(matcher.group(1));equipment1.add(l);equipment.add(l);}if (matcher.group(2).compareTo("B") == 0) {B b = new B();b.setName(matcher.group(1));b.setResistance(10);equipment1.add(b);equipment.add(b);}if (matcher.group(2).compareTo("R") == 0) {R r = new R();r.setName(matcher.group(1));r.setResistance(5);equipment1.add(r);equipment.add(r);}if (matcher.group(2).compareTo("D") == 0) {D d = new D();d.setName(matcher.group(1));d.setResistance(20);equipment1.add(d);equipment.add(d);}if (matcher.group(2).compareTo("A") == 0) {A a = new A();a.setName(matcher.group(1));a.setResistance(20);equipment1.add(a);equipment.add(a);}if(matcher2.find()){M m = new M();m.setName(matcher2.group(1));equipment1.add(m);}str = str.substring(matcher.end());matcher = pattern.matcher(str);}
搞完这个就要准备计算了,因为要求在最后再来处理精度的问题,
使用前面的数据传递使用的都是Double类型;
所有的计算都通过各自的类的方法进行,让主函数里的代码看起来更加简洁
这里用到了多态,例如:
计算电阻时,因为串联电路和并联电路电阻的计算方法不一样,但都需要计算他们的电阻,所以在他们的父类中定义了求电阻的方法,再在串联电路和并联电路中重写方法,实习不同方式的求电阻,即实现了多态.
最后输出是要对所有电器进行排序:
public int compareTo(Equipment o) {String[] str={"K","F","L","B","R","D","A"};for(int i=0;i<str.length;i++){if(this.getName().startsWith(str[i])){for(int j=0;j<str.length;j++){if(o.getName().startsWith(str[j])) {if (i < j)return -1;else if (i == j)return this.getName().charAt(1)-o.getName().charAt(1);elsereturn 0;}}}}return 0;}
使得电器按照一定顺序输出.
这道题的思路如图:
(3)采坑心得:这次作业第一次提交发现数据对不上,检查都发现是在传递数据时就把数据搞成整数了,后面的部分直接被丢弃了,导致后续计算出了问题.
后面又发现再有多个开关时,电路的开关有问题,当一个开关开,一个开关闭时,电路竟然是通电的,被自己整笑了当时.后面改进的电路闭合判断的代码;
public boolean isLink(){link=true;for (Equipment equipment1 : equipments) {if (equipment1.getName().charAt(0) == 'K') {K k1 = (K) equipment1;if (k1.isOn_off()) {link = false;}}}return link;}
在第一次作业时,我是通过关注输入电压输出电压的方式去计算整个电路,第一次作业没考虑电阻,我是直接遍历这个电路,从头开始一个个传递电压.
int size = equipment.size();for (int i = 0; i < size-1; i++) {Equipment equipment1=equipment.get(i);if(equipment1.getName().charAt(0)=='K'){K k1=(K)equipment1;equipment.get(i+1).setInput(k1.getOutput());}if(equipment1.getName().charAt(0)=='F'){F f1=(F)equipment1;equipment.get(i+1).setInput(f1.getOutput());}if(equipment1.getName().charAt(0)=='L'){L l1=(L)equipment1;equipment.get(i+1).setInput(l1.getOutput());}if(equipment1.getName().charAt(0)=='B'){B b1=(B)equipment1;equipment.get(i+1).setInput(b1.getOutput());}if(equipment1.getName().charAt(0)=='R'){R r1=(R)equipment1;equipment.get(i+1).setInput(r1.getOutput());}if(equipment1.getName().charAt(0)=='D'){D d1=(D)equipment1;equipment.get(i+1).setInput(d1.getOutput());}}
到第二次作业时要考虑电阻了,发现第一次的方法做不了,就改成求电流先,再去计算每个电路设备说占电压.
(4)改进建议:计算方面要多搞几个样例测试,进一步提高代码的简洁性,复用性,整个设计结构要优化,使得下次作业时也能用上现在的结构,不用再去大改.
正则表达式那块可以剔除点,匹配一部分即可,但需要多次匹配.
(5)总结:
这次作业让我越来越熟练的使用正则表达式去获取信息,认识了正则的效率问题.认识到实际工程中程序对各种不同状况做出的反应都应该符合用户需求。还有在数据传递中的数据完整性问题,在这种对数据准确度要求高的情景下,要尽可能的保存传递完整的数据,不要"缺斤少两".最后,最最重要的就是加强了面向对象的思维。