Blog3

三次作业所学

前一次作业,主要加深了我对对象与类的应用尤其是抽象类的继承使用及接口的调用使用这一方面的知识。而是后两次作业,让我对链表的使用更上一层楼。其次,动辄四五百行的代码以及提交的代码长度限制,让我学会尽量用最简洁的代码完成所需的功能。在抽象类中定义的抽象方法可以强迫继承其的子类去实现。同时抽象类是无法创建对象的。Collection接口常用的子接口有:List接口(允许有重复的元素)、set接口。List接口常用的子类有:ArrayList类、LinkedList类(允许有重复的元素,有序的),Set接口常用的子类有:HashSet类、LinkedHashSet类(不允许存储重复元素,无序的)。

 

次作业(7-1)题

本题要求根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数输出排序前后图形的面积。

1、本次作业要求对卡片排序时使用 Comparable 接口, 即 Card 类需要实现 Comparable 接口中的 CompareTo()方法。Comparable 接口内部只有1个要重写的关键的方法.就是int compareTo(T o)这个方法返回1个Int数值,  例如 i = x.compareTo(y)如果i=0, 也表明对象x与y排位上是相等的如果返回数值i>0 则意味者x > y反之若i<0则意味x < y

在本题中的核心代码应为

import java.util.Collections;

public int compareTo(Card o){

Card s = (Card)(o);

return this.getShape().getArea() - s.getShape().getArea();

}。

之后用Collections.sort(list);方法排序。

当然,Comparable 接口中的compareTo方法的重写并不唯一,如果只实现程序功能的话,还可以写成

public Card compareTo(Card card){

Card card11 = this; // 小

        Card card22 = card; // 大

       if(card11.getShape().getArea()>card22.getShape().getArea())

       {

        card11 = card;

        card22 = this;

       }

      

        return card22;

 

}

这样写没用Collections.sort(list);方法排序;但要自己再写过一个排序方法。如 public void cardSort() {

     for(int j = 0;j<cardList.size()-1;j++) {   

     for(int i = j+1;i<cardList.size();i++)

    Collections.swap(cardList, j,  cardList.indexOf(cardList.get(j).compareTo(cardList.get(i))));

     }     

    }

 

曾遇到的错误

1、.忘了加终止程序的语句System.exit(0);从而导致错误。

2.第一次重写Comparable 接口中的compareTo方法时写错。

3.在创建并使用ArrayList链表时发生过类型语法错误。

附图

 

 

 

次作业(7-2)题

本题要求与上题几乎一样,如果只需完成程序功能,将上体代码稍加修改即可。

如为实现分组排序的功能需在类 class DealCardList 中多创建四个链表

ArrayList<Card> cardList1=new ArrayList<Card>();

ArrayList<Card> cardList2=new ArrayList<Card>();

ArrayList<Card> cardList3=new ArrayList<Card>();

ArrayList<Card> cardList4=new ArrayList<Card>();

这四个链表分别储存1圆形卡片,2矩形卡片,3三角形卡片,4梯形卡片的对象。再在各个链表中对相同类型的对象的面积进行排序。这和之前对不同类型的对象的面积进行排序没有本质的区别,都是对同一ArrayList链表的成员的面积进行排序。排序部分代码如下: public void cardSort() {

     for(int j = 0;j<cardList1.size()-1;j++) {   

     for(int i = j+1;i<cardList1.size();i++)

    Collections.swap(cardList1, j,  cardList1.indexOf(cardList1.get(j).compareTo(cardList1.get(i))));

     }

     for(int j = 0;j<cardList2.size()-1;j++) {   

         for(int i = j+1;i<cardList2.size();i++)

        Collections.swap(cardList2, j,  cardList2.indexOf(cardList2.get(j).compareTo(cardList2.get(i))));

}

至于新增的实现各组中面积之和的最大值输出的功能,只需先求出各组卡片的面积之和,创建一个新的数组,将它们放入这个新数组中,用Arrays.sort();排序,并输出最大值。

 

附图

 

 

题目集7-1)、题目集7-2两道题目的递进式设计分析总结

  1.  毫无疑问,题目集7-1题目集7-2是即为相似的,甚至可以说题目集7-2就是题目集7-1的改版。题目集7-1要求的是排序后的各图形类型及面积,所有图形的面积总和的输出题目集7-2要求的是各组内图形排序后的各图形类型及面积,各组中面积之和的最大值输出题目集7-1题目集7-2递进式设计两者在知识点上并无新的要求,主要考察ArrayList泛型的应用方法Comparable接口及泛型的应用以及单一职责原则的应用,“开-闭”原则的应用另外,还涉及到了封装、继承、多态抽象类接口。
  2. 设计上,在以实现题目集7-1所需功能的情况下,为实现题目集7-2的功能,将题目集7-1中的对一个链表中不同类型的对象的面积进行排序代码改为对各个链表中对相同类型的对象的面积进行排序。将对所有图形的面积总和改为对不同类型的图形分别求总和,在对这些总和进行排序,输出最大的总和。

 

题目集8ATM机仿真题目的设计思路分析总结

本题目要求编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。 在编写本次代码时我只考虑完成任务功能,并没有考虑代码的可扩展性,这也为下一次作业埋下隐患。本次作业代码可以分为两个部分,一是对所给出的数据进行初始化,二是调用这些初始化的数据,经过一系列的运算方法后即可得到所需输出结果。第一个部分便让我吃了个苦头,当时我想用链表进行初始化,即分别创建用户、银行、卡号、账号等链表,应为存在一个账号多个卡号的问题(这也是最麻烦的),为了之后方便计算,做到一一对应,我便以卡号为基础,及有多少卡号,就创建多少对应的银行、用户、账号等。这样根据输入的卡号用card.getArraylist().indexOf();来得到所需的对应银行、用户、账号、余额的下标,再通过list.get();方法来获取所需输出的元素。取款存款也是用这种方法得到数据进行操作。但这种方法虽然完成了程序所需的功能,但在我看来,有两个严重的不足之处,首先一个账户对应一个余额,存在一个账号多个卡号的问题,而我却是以卡号为基础划分的,这就导致在计算一个账号多个卡号的存取款时,要单独把这种情况拿出来,对两个卡号对应的两个同一个余额进行运算。因为给出数据中一个账号多个卡号的情况不多,所以看不出什么大问题,但这对程序的扩展及其不利。另一个问题是链表的获取,应为我在不同类中定义了各字的链表,在通过getArraylist();在其他类中来获取链表中的数据,然而这种方法存在非常大的问题,那就是只能获取不变的链表,如果像余额链表中一个元素,初始值为10000.0,经存取款改变后为20000.0;我在其他类中通过getArraylist();得到的这个元素的值仍为10000.0;当时因为赶进度也没有想解决的办法,而是直接将存取款的运算放到了余额Balance类中,避开了这个问题。这也为程序的可扩展性打了折扣。

 

 题目集9ATM机仿真题目的设计思路分析总结

在题目集八的基础上,题目集九除新增几组数据外,还增加了借记账号与货记账号的区别,还增加了手续费的区别,这些是存取款计算余额的区别,需要改动余额计算的代码。因为跨行取款的存在,在计算手续费时不能根据卡号对应的银行来计算手续费,为了程序的功能得以实现,我又新建了一个Bank1类,这个类中链表元素与ATM类中链表元素一一对应,这样就可以根据输入的ATM机的编号来知道是在那个银行存取款。这就是题目集九在题目集八上的改动,因为写程序时单纯为了完成任务,用了很多if语句来完成简陋程序功能,这导致即使我思路清晰,自认为完成所有的功能,但却没有拿到满分,因为实在是太难找到错误了。

 

采坑心得

写程序不能东拼西凑,处理不同情况时应按照情况分类,而不能对一种情况中的每一个例子进行分类,这样写出来的程序扩展性实在太差,应该减少if语句的使用,能不用就少用,不然找错误的时候非常麻烦,明明有一个点通不过,却始终不知道错字哪里。在写关于计算的程序时要尤其注意,这是诞生逻辑错误的高发点,尤其在计算过程受多种因数影响的时候,最好先将计算过程写在纸上,避免直接写时缺斤少两。这两次作业反应了我在链表使用上的不足,因加强对此的学习,毕竟最大的坑,就是知识上的不足!

 

改进意见

第八九次题目,因为一个账号对应一个余额,以账号为基础会更好,为解决一个账号多个卡号的问题,可以将多个卡号一起写在同个元素上,卡号之间用空格隔开,在从输入的卡号判断是否卡号链表元素的子集,若是则将该元素下标提出,得到其他的所需数据。这样也极高了程序的可扩展性。减少用if语句来处理特殊情况。

 

总结

经过这几次作业,我对对象与类的应用更为深刻抽象类的继承使用及接口的调用已经深入于心。大量链表的创建与调用加深了我对链表的了解。其次,动辄四五百行的代码以及提交的代码长度限制,让我学会尽量用最简洁的代码完成所需的功能。在写代码的过程中思路很重要,你要对自己的代码是如何实现所需的功能有清晰的了解,思路越简洁,写出来的代码自然就更高效,但有了思路,也得有相应的代码知识去把思路转换为代码。如果相应的知识缺乏,也是无法完成任务的。我现在的学习还远远不够,应该以持之以恒的耐心投入java的学习,毕竟最大的坑,就是知识上的不足!

 

posted @ 2021-06-20 22:08  budongjiuwen  阅读(81)  评论(0)    收藏  举报