通过本次作业,我们将对第二单元的作业做出总结。
第五次作业的第一题就十分的难,是一道处理字符串的题目,要用到正则表达式,要求十分繁琐,且第一次作业的题目都要求用固定的参考类图完成作业,并不需要设计,且第一次作业的最后一题用到了“继承”这个类与类之间的关系,用继承来实现多态这个java核心功能,总的来说,第一次作业将我们带上了一个高潮,因为我们在第一次作业学会了很多;
第六次作业的第一题要求我们在第五次作业最后一题的基础上研究平面图形的处理方法,且用到了抽象类,要求我们继承时重写抽象类的方法,最后实现面积的输出以及(冒泡排序)面积排序后的输出;第二题则更为复杂,要用到正则表达式将多项式分开求导,里面包含着许多string类的方法,且要用到链表储存这个多项式以及求导后的多项式,最后输出;
第七次作业的第一题其实是第六次作业第一题的再扩展,让我们用card这个类来实现对图形数据的存储以及用DealCradList这个类实现对card的输出及排序,我们第一次接触了接口这个“类”,这次作业的面积排序要求我们用comparable这个接口重写里面的方法来实现;第二题其实是在第一题的基础上修改一些东西;而第三题,是一道考虑程序运行时间的算法题,这题的最优算法也十分难想出来;
1.作业过程总结:
①总结三次作业之间的知识迭代关系;
从第五次作业正则表达式与字符串处理以及链表的初应用和继承的初应用到第六次作业第二题的更为复杂的正则表达式和字符串处理以及链表的应用到第七次作业的接口,继承,复用等多种结合,呈复杂化递增;
②如何通过作业逐步从面向过程过渡到面向对象;
在这个单元,老师向我们介绍了面向对象六大原则的四个原则和迪米特法则(上次介绍了开闭原则和单一职责原则),使我们更深层次了解到了面向对象的基本原理,通过作业,深化了我们对的面向对象的更深层次的理解;
③作业过程中遇到的问题及解决方法
1.在第五次作业的第一题中,我对于如何处理水文数据不知道怎么解决,于是经过了资料的查询发现有俩种办法可以解决
String[] k = str_list.get(i).toString().split("\t"); String[] l = k[0].split("/"); String[] c = l[2].split(" "); String[] w = c[1].split(":"); String[] q = k[3].split("/"); String[] test = new String[] {k[0],k[1],k[2],q[0],q[1],k[4]};
上述这种是利用split分割字符串
Pattern p = Pattern.compile("所要寻找的字符串的正则表达式"); Matcher m = p.matcher(str1); while(m.find()) { m.group; }
这种是寻找需要的字符串
在权衡利弊中,我还是用了split分割字符串,因为这种更方便知道处理过后字符串的正误性;
2.在关于对象如何排序问题,对对象的属性进行冒泡排序是再好不过的方法,但是这个却又不是最好的办法,因为java为我们提供了多个实现对对象排序方法的接口,在网上查找资料后,我查找到了一种十分快捷的办法;
Collections.sort(array1, new Comparator<Shape>(){ @Override public int compare( Shape s2,Shape s1) { if(s1.getArea()>s2.getArea()) return -1; else return 1;} });
注意返回的数一定要是相反数才可以;这种是利用了Comparator接口直接在Collections中重写方法,十分的便捷;
3.在第六次作业第二题的多项式求导中,关于多项式的求导也还是用到1的方法,但是有个测试点一直过不去当用查找方法匹配字符串时经过多次正则表达式的匹配,发现这种是正确的;
String regex = "(([+-]?\\d+\\s?\\*\\s?x\\s?\\^\\s?[+-]?\\d+)|(\\s?[+-]?\\s?x\\^[+-]?\\d+\\s?)|(\\s?[+-]?\\d+\\s?\\*\\s?x)|(\\s?[-+]?\\d+\\s?)|(\\s?[-+]?\\s?x\\s?))*";
4.在继承关系这一方面,写子类时,老是碰到关于方法名写错的问题,导致多态实现失败,用@Override这种可以完美的避免此种问题;
5.在第七次作业的第二题,要求我们在第一题的基础上修改,使程序达到要求,我发现直接在DealCardList类添加属性就可以完美的正确执行;构造方法如下;
public DealCardList(ArrayList<Integer> list) { for(Integer tmp:list) { if(tmp.equals(1)){ double r = Main.input.nextDouble(); cardList1.add(new Card(new Circle(r))); cardList.add(new Card(new Circle(r))); } else { if(tmp.equals(2)) { double length = Main.input.nextDouble(),width= Main.input.nextDouble(); cardList2.add(new Card(new Rectangle(length,width))); cardList.add(new Card(new Rectangle(length,width))); } else if(tmp.equals(3)) { double side1 = Main.input.nextDouble(),side2 = Main.input.nextDouble(),side3 = Main.input.nextDouble(); cardList3.add(new Card(new Triangle(side1,side2,side3))); cardList.add(new Card(new Triangle(side1,side2,side3))); } else { double top = Main.input.nextDouble(), botton = Main.input.nextDouble(),height = Main.input.nextDouble(); cardList4.add(new Card(new Trapezoid(top,botton,height))); cardList.add(new Card(new Trapezoid(top,botton,height))); }} } }
6.在关于如何遍历链表或者数组时,我发现除了for循环(i++的类型)遍历有很多种不错的方法:
list.stream().forEach(System.out::println);//流类 for(Product p1:list) { System.out.println(p1.toString()); } Iterator<Product> itr = list.iterator(); while(itr.hasNext()) { System.out.println(itr.next().toString()); }//迭代器
7.关于第七次作业的最后一题的算法要使程序执行时间缩小到秒以内我只能做到(不知道咋优化)最多使第二个循环时间复杂度开方;
for(int p = 1;p <= num;p+=2) { boolean t = true; for(int i = 2; i < p;i++ ) { if(p % i == 0) { t =false;break; } } if(t) sum++; } System.out.println("Prime num["+(sum-1)+"]"); }
④每次作业花费的时间比例
第五次作业 :第六次作业:第七次作业 = 6 : 2 : 1;(随着对面向对象的核心掌握,所用的时间就短了)
⑤对编程过程的逻辑严谨性的认识及教训
编程时一定要考虑周全,关于基本结构的设计可以在passern on或者草稿纸上面进行,大可不必直接去编写程序,有时候老是一个测试点过不去,到头来发现还是没有考虑周全,所以一定要好好考虑;
2.OO设计心得
①面向过程与面向对象的比较
通过第二阶段的学习,我掌握了面向对象的六大原则以及迪米特法则,觉得利用面向对象能更好的解决实际问题(相比面向过程);
②面向对象设计的基本原则理解
在此阶段,老师讲完了面向对象的六大原则和迪米特法则
其中里式代换原则指出所用引用基类(父类)的地方必须能透明地使用其子类的对象;
依赖倒转原则要针对接口编程,不要针对实现编程;
接口隔离原则是指专门的接口,而不使用单一的总接口;即每个节应该承担一种相对独立的角色;
③OO编程思维的理解
合成复用原则是应该尽量使用对象组合,而不是继承来达到复用目的;
迪米特法则是要使软件之间的连接尽可能的少,所以修改时就可以尽量少的影响其他模块;
③OO编程思维的理解
经过这么多次的练习,我更觉得oo思维就是针对对象编程,然后完成对象的联系就 能达到目的;
3.测试的理解与实践
①测试对于编码质量的重要性
在经过第一次试验之后,我更觉得测试是一种编写程序之后必须的步骤,因为这样能及时的发现程序的纰漏,以避免对之后程序的正确性的影响;
②假如让你设计测试用例,你会如何做
假如让我设计测试用例,我会针对不用极端出测试用例,因为这样能更好的知道程序的不足;
4.课程收获
在第二阶段,我学到的东西十分的多,面向对象六大原则以及迪米特法则,接口,子类,父类,继承,抽象类,复用,实现接口,多态,泛化.....这些java的核心操作以及思想都接触以及掌握;我更加了解到oo思维的核心;
5.对课程的建议
希望老师能够加强我们对oo思维的核心的理解
希望老师布置的作业能够再复杂一点