标签:简练 查询 计算 位置 学习 col run 忘记 无法
第7,8,9次题目集简要分析总结:
在这几次题目集的做题目过程中对类这种模块化处理问题的使用每次均出现。进一步深入的体现java的核心功能,如题目中体现的掌握类的继承、多态性使用方法以及接口的应用。双向链表的使用,如何去高效率地查找数据并且能对所查找到后对象的数据进行操作。在上一次的题目集的基础上进行迭代,体现继承的思想同时展示多态的作用。总的来说是在进一步的学习中深入了解java的三大支柱,封装,继承,多态和对数据结构的基本认识因为在第八次和第九次的题目集中要实现数据的一对多关系,以及对接口的练习使用。对于我感觉的题目集难度而言,还是有一定的难度的,但是在自学了一部分和别人给予的一定帮助下还是完成了题目基本要求,更多的难度与我而言是代码写的不够简练难以让人看懂以及很繁琐。
题目集7(7-1),(7-2)关于其递进思想设计的简要分析总结:
这两个题目的主体结构类似,后一次题目是在前一次题目为基础上的一次升级,添加了新的功能要实现的一些功能即需要加一些方法。均是关于卡片的问题,即输入一定的数字选择相应的图形,接下来输入原本构建好图形的各个数据如长,宽,高之类的属性。根据两次题目的要求写出对应的方法即可。接下来我对递进式设计做出一些分析,仅供参考。
首先对题目集7(7-1)进行分析处理:
在本次题目中的指导书中给出了相应的参考类图,所有可以根据已有的类图来进行类的构建和方法的添加。
简要的分析类图,类图中所给出要构建的类有抽象类Shape类作为四个实体类的父类,四个图形实体类用于存储和操作分别对应的输入数据,分别是Circle类,Rectangle类,Trapezoid类,Triganle类。用于判断输入类型,计算图形面积和输出结果,对图形分类的DealCardList类。引用接口进行各个图形面积数据对比的Card类和一个主类。类的数量和关系不太复杂,Shape作为一个父类泛化出四个实体类,主类依赖于DealCardList类,DealCardList类依赖于Card类,Card通过Shape型的参数依赖于Shape类,每个类中拥有各自的处理问题的细节方法。很明显大多的数据处理的方法都包含于DealCardList类当中。
接下来我对我所遇到的一些问题来进行简要的情况分析:
首先指导书中给出了主类中输入数据的方法过程。
初次在各个实体类当中忘记重写父类中对于非法数据判定的方法,一开始没能通过非法数据输入的测试,第二次多次测试后发现对三角形的非法数据判断的方法写的有错误,导致无法判定三角形数据的非法输入,将方法如上图重写了就解决了这个问题。
一开始我并没有搞明白Card类的作用,之后多次尝试发现这个类就像一个中间媒介,因为我要输入多个不同的数字代表了不同的图形类型,那么我借用这个类来实例对象又被Shape类调用,那么这样可以在下次扩展上提供很大的便利。
当面对对按照图形面积来排序时遇到了问题,因为面积好比较,每个面积的所属对象是存在对象链表里面,之前未接触到过对链表中元素的排序情况,初次是尝试用和对一个通常的数组那样直接采用冒泡排序来解决问题,但是冒泡排序是需要一个中间值来交换元素的位置,开始碰到的问题是类型不匹配,就把中间值的类型换成了Shape类型,之后发现链表好像不能像普通的数组那样进行简单的元素覆盖来达到元素交换的目的,于是在查找资料后发现可以采用如下的方法,引入Collections.swap()方法,直接交换两个元素在链表中的位置,前面加一个判定条件就可以了。
做题过程中也碰到了空指针和调用错构造方法的情况以及实例化错误的对象,这些问题不多加介绍。
问题总结:
在第一次看到类图时是没有看懂Card类的作用的,因为我一开始觉得这个类太过多余只是起到了一个给输入的数据对象加上一个类型的作用,那么既然这样为为什么不直接把这个方法写入到DealCardList类或是主类当中的。之后反思想到单一职责原则,让一个类尽可能不要执行太多的功能,如果把多个方法塞到一个类当中去实现,这个类应该会显得十分“臃肿”,不便于扩展,结合实际情况分析,当遇到扩展的情况保持单一职责更有利于去改进代码且不出错。
在题目集7(7-1)的基础上对(7-2)简要分析:
对比(7-1)中的功能要求可以发现(7-2)中多出了1.按一定图形类型的顺序且每一个图形类型的集合中又按面积大小来进行输出。2.求出每组内图形面积的总和。3. 求出所有组的面积总和的最大值并输出。
在对题目进行一些思考后我认为本次的代码主题框架并不会与上次的有太多差别应该是在原有的基础上添加了一些方法来进行扩展。
对于第一个问题的解决,我是一开始打算还是像之前一样把所有类型的对象数据全放在一个链表中之后再添加一定的判断方法把这些不同的对象给区分开来再一一分组求和,但是因为这些对象是无规律的输入很难分开,于是我采用了如下的方法。
根据它们所代表的图形的类型不同把他们分入不同的组里之后在直接写一个方法遍历整个链表调用可以获得每个对象面积的方法一个一个加起来返回整体的面积值就好了。
在按照题目所要求的一定规则输出时,由于我之前已经把每个对象给分粗放入了几个对象链表当中那么我按要求先遍历圆的再遍历矩形的链表...就可以了。
最后输出几个组合当中最大的组合面积只要构造一个简单的比较方法就可以了。
有关题目集7(7-2)的类图简要分析:
很明显的是类图展示的整体框架和上一题的框架基本相同只是在DelaCardList类当中根据题目所需添加了几个方法,由于之前已经介绍过(7-1)的结构在此不再多说。
关于(7-1)和(7-2)的递进式设计的分析:
(7-2)在(7-1)上提出了更多的更多的功能需求,进行了一些扩展。首先在两个题目中都体现了多态的思想即由父类的指针指向了子类的对象来进行调用处理,Shape类泛化出的四个子类,它们的对象均可以直接通过Shape类来进行操作。后者在前者的基础上对具有同一父类的子类对象进行了分组处理,前者的需求只需要全放在一个链表中添加一个判断方法即可实现但是后者如果还是按照这个思路需要添加好几个判断条件才能完成扩展,前者是先把所有的对象全放在一个链表中之后在输出前进行了实例化对象和判断,后者是直接把对象分组好了再进行处理。那么这样是否当面对出现继承的情况时有多个子类它们有着各自的对象应该先分组再进行创建方法完成需求呢?我想在本题体现的就是这种思想,便于扩展需要在对数据进行操作前而完成分类。
关于题目集7代码需要改进的地方:
题目集7(7-2)在原有的基础上进行了进行了功能扩展,但是我完成需求是写了多个方法把它们都放入了一个类当中,这样的做法违背了单一职责原则,所以下次进行扩展时完成新的功能需要应该多写几个类每个类执行一个功能要求。
还有是在算法的设计方面,有些算法还是使用太多的if语句和for循环,让代码更加难以让人看懂和下次改进。这样的话当面对能用Swtich case代替if else的情况还是优先选择前者,和还是多使用增强的for循环。
题目集8的大致分析:
本次题目是有关实际生活问题ATM机的简化问题,能完成对用户的存款取款和查询余额的功能。我认为本次题目当中设计算法很简单,更多的是让我进一步了解多态的实现和其带来的便利,以及对设计合理的数据结构来有助于查找数据。
首先对本次题目集中的题目的类图分析:
整体一共构建了七个实体类,并没有出现继承的关系,而是互相依赖形成逐级调用的关系,主类完成了对数据的输入,同时也完成了对数据的输出,Operate这个类里面包含了多个方法来处理数据,其他的几个实体类中没什么特别的方法除了一些个体get set方法。
在本次问题中遇到的相关问题分析:
首先是考虑到本题目的需求更侧重的是对数据的查找框架的设计,那么肯定要觉得以哪个类型的数据为底层数据来展开查找呢和到底是从底层数据开始还是从上层数据开始呢。开始的想法是银联包含了银行银行包含了账户,银行卡中有余额这个属性,那么这样的话用户的关系是独立的吗?如果是独立的话那么它其中的数据该被哪个类调用呢?为了便于处理问题的需要我还是看作了银行其中包含了用户这么依次下去。然后决把银行卡看作底层数据这么从下到上的查找。
该采用哪种数据结构呢?在进行题目集的任务时老师介绍了如何使用链表完成数据的一对多和让我们思考如何完成双向的数据查找。但是我选择的是Hashmap,那么要解决的有两个问题,怎么去完成数据的存储和数据的查找,第一次的尝试完全是掉坑里去了。一开始我是把银行名作为map的key用户名作为value值然后再另一个类里面创建另一个map,用户名作为key值,账户号作为value值,如此嵌套下去,那么应该我输入一个银行卡号设计一定的循环结构,就可以先找到账户,再根据账户找到用户最后找到银行。但是我运行后发现查找到的数据和预期的不一样,多次测试和查资料后发现原来map的key值是唯一的不能出现重复,要实现运用map来完成数据的一对多还是要用到链表,改进后我还是原有的顺序不变,但是一个用户拥有多个账户时那么把这多个账户整合成一个链表,同样的整合多个银行卡为一个链表。这样改进下原来的循环结构就能完成数据的查找了。
输入存储数据也遇到了一些问题,一开始我以为每一行是多个字符串,之后发现是多个按照空格分开的字符串。
所有我先用动态数组来存入了这么几行的字符串,之后可以创建出已知规模的字符串数组,然后再进行按照空格分割依次处理。
输出格式和输出之前的判定方法的顺序也出现了一些问题。测试几次修改下就好了。
有关题目集8的思考:
在本次的题目集中首次接触到了对数据查找而设计数据结构的问题,也首次使用了map的嵌套。整体的算法难处在于怎么设计循环去查找目标,选择适当的数据结构还是很重要的。还有如果我是给的是账户信息那么怎么根据这一的信息查找到所属银行呢。代码的改进方面,我认为我的代码缺陷在于把很多输出前的处理直接放在主类里了,主类里面添加了太多的东西,然后就是输入时的处理数据方法设计的太复杂冗长,优化算法和优化代码结构还是需要提前构思好要设计哪些类和哪些方法以及这些方法应该放在哪些类里面来实现。
有关题目集9的简要分析:
本题是在题目集8内容上的迭代,添加了几个对象和信用卡的功能,老师给出了题目集8的源码,希望我们能在已有的基础上实现代码的重构,体现出多态的思想。
题目集9的类图分析:
为了完成数据的对应关系还是设计很多实体类来存储数据,由于要实现新功能和之前不同的是本题中的设计思路是把Accont抽象后泛化出CriditAccount类和DebitAccount类,来分别引入信用卡和借记卡对象,GetBalance类完成获取余额的操作,ValidateData完成了非法输入判断的操作,Withdraw类完成了取钱和存款的操作,主类在完成了输入和调用别的类完成了输出。
对于题目集9的反思:
本次题目是基于上次的题目添加了信用卡的功能,那么必然会出现信用和借记这么两个类,所以要对哪个类进行抽象然后泛化呢?开始的想法是抽象Card类并泛化,之后又想到了钱是存在了账户里而并非银行卡里,那么就要对Acconut类进行抽象。
怎么实现题目中所要求的多态呢?一开始我是想既然已经Account泛化了两个子类,那么用这两个子类来分别实例所对应的数据不就好了,那么按照这样的思路我进行存取操作时还要先判断输入的卡到底是银行卡还是借记卡,虽然解决这个问题只需要在类中添加一个构造方法让其返回一个特定值再根据这个特定值来判断卡的类型就可以了,但是我这样的话还是要设计两个取款方式,因为借记卡是不可透支的,这样一来太过麻烦,那么为了实现多态和做题方便,我如下的实例对象完成让父类的指针指向了子类的对象,那么接下来的操作中我只需要引用父类即可。
透支额度的问题我是在子类的属性中初始化了借记卡的透支额度为零信用卡为五万实现了下面觉得运算过程。
有关题目集9的反思:
题目集9的设计不同于我的题目集8,把原有采用到的map数据结构换成了链表。而且把很多功能的实现不再像之前也有全放入了一个类多写几个方法,而是创建了几个类来分别实现这么几个功能。但是关于透支额度这个设计处理感觉还是和预期的有差别,如下在透支余额的处理上我总是把它和余额绑定在一起进行判定,那么是否等同于其实我只是把这信用卡和借记卡都看作了一类,只是它们的余额不一样而已,如果要实现这一区别是否还是要区分来银行卡和借记卡并设计两个不同的方法来处理这两种对象呢?本次题目集也是我初次接触到了迭代器,Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
心得小结:
1.在多次的使用继承和在继承后对多态的实现,了解到多态可以是类内部方法名相同有着不一样的参数和返回值或者是父类的指针指向了子类的对象。
2.由于两次的迭代和扩展中遇到的问题,了解到单一职责原则和开闭原则的重要性。
3.Map的多次使用和迭代器的初次使用以及增强循环的大量应用和尽量用SwtichCase语句去替代If语句,这些经验让代码更加简洁了,但是还需要大量的练习提升。
本阶段的学习和建议:
本阶段的题目量很少但是有一定的难度,是对java三大支柱中的继承和多态的加深联系以及对数据结构设计的尝试。以我而言这样的学习难度对我有一定的挑战性,正好合适。
标签:简练 查询 计算 位置 学习 col run 忘记 无法
原文地址:https://www.cnblogs.com/hxc74/p/14860485.html