第三次blog作业
1.前言:
这三次题目集的难度较之前的题目来比较难度加大了很多,属于那种需要花大量时间并且需要老师给提示的那种;题量不多一共就只有4道题。这四道题目涉及到的知识点较前面的题目相比增加了接口的使用,在题目集7的第一道题中出现了静态Scanner的使用还有对Arraylist的排序,还用到了迭代器;Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet…,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式!把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构
Java中还提供了一个Iterable接口,Iterable接口实现后的功能是‘返回’一个迭代器,我们常用的实现了该接口的子接口有:Collection、List、Set等。该接口的iterator()方法返回一个标准的Iterator实现。实现Iterable接口允许对象成为Foreach语句的目标。就可以通过foreach语句来遍历你的底层序列。
Iterable接口包含一个能产生Iterator对象的方法,并且Iterable被foreach用来在序列中移动。因此如果创建了实现Iterable接口的类,都可以将它用于foreach中。
2.设计与分析:
在题目集7中第一题和第二题在运行过程中并没有什么太大的区别,只是在最后输出的时候有一些区别所以两道题的代码基本上可以共用,只是在写第二道题的时候需要添加一些新的类来给出不一样的结果

题目集7只要是根据已经给出的类图来编写代码,在每个图形的类中都会有从Shape类中继承到的得到面积和判断输入是否合法的方法,得到面积的方法就是通过公式将输入的数据进行计算然后返回面积,判断输入是否合法的方法就是根据题目的要求对图形属性输入的数据进行限制,若不在这个限制中,则整个程序直接结束并给出错误报告,只有图形属性输入数据合法程序才能继续运行下去。DealCardList类主要是获得所有图形的信息,而且对于结果的输出也在其中,在这类中有一个方法是对图形面积的值进行排序
TreeSet<Card> cards = new TreeSet<>(cardList);
for (Card card : cards) {
System.out.print(card.getShape());
}
这个是我在网上找到的对ArrayList类型数据进行排序的一种方法,到之后在写第二题的时候又找到了一个更加简便的方法
Collections.sort(circle);
这个方法也可以对ArrayList类型的数据进行排序,而且更短。
其他方法的运用就都是一些比较常规的运用
题目集8和题目集9都是对于ATM机的编写,在题目集8中ATM机的功能不是非常的完善,只具备提款和存款的功能,而在编写ATM机代码的时候,需要将各个类之间联系起来,哪个类属于哪个类需要做到明确的编写,并且在题目集8中无论是取款还是存款都有一个很大的限制,那就是只能在自家银行进行,不能够跨银行,而在题目集9中不仅解决了这个问题,还额外添加另一种新的卡,可以贷款。
我的设计是先将关于各个用户的信息先存入到银联中,之后输入的时候通过比较来判断该用户是否存在和对用户进行操作;
对用户的判断中需要判断卡号,密码,还有ATM机,只有在三者都是正确的情况下才会进行下一步的操作,否则的话会直接终止程序的运行。
对于各个类之间的关联,我们用的是关联的关系通过在一个类之中创建另一个类来实现对另一个类的调用,而在信息的存入中,也是将不同的信息存入到不同的类中
Iterator<Card> cardItr = Account.list.iterator();
Card card = null;
while(cardItr.hasNext()) {
card = cardItr.next();
if(card.getCardNO().equals(cardNO)) {
return card.getAccount();
}
}
在代码中会通过这一串代码来对输入的卡号与存入的卡号来进行对比,如果正确则程序继续进行,否则程序终止
while(bankItr.hasNext()) {
ArrayList<Account> accountList = bankItr.next().getAccountList();
Iterator<Account> accountItr = accountList.iterator();
while(accountItr.hasNext()) {
ArrayList<Card> cardList = accountItr.next().getList();
Iterator<Card> cardItr = cardList.iterator();
while(cardItr.hasNext()) {
card = cardItr.next();
if(card.getCardNO().equals(cardNO)) {
return card;
}
}
}
}
这也是一个用处差不多的代码,它是用来检验卡号是否存在的
在这两串代码中都用到了同一个东西iterator迭代器,Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素
Iterator遍历时不可以删除集合中的元素问题
因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)
3.采坑心得:
在进行数据的测试的过程中经常会出现,数组的长度超出的问题,这主要是因为在数组中运算的时候总是会超出数组的长度,然后就导致报错了;中会忘记了将图形数量非法相关的代码写进去,然后就总是过不了第一个测试点,后来在进行第一个测试点的编写的时候不管将判断放在哪里都起不到作用,后来还是因为先将其他的代码写完之后来测试才过的,我自己至今都还是不太明白之前为什么没有过那个测试点,为什么其他代码写完之后就可以过第一个测试点了;会忘记了运用到多态性;中关于注释的代码中的关键字不给予计算,再用正则表达式对注释符进行匹配的时候,总是会将不需要删除的信息给删除,而且对于两种不一样的注释符一起运用时做不到不同的匹配和分割方法,就是说每次都只能对一种注释方法进行匹配,两种注释方法一起运用时就会出现错误;在中正则表达式的运用出现了误差,虽然在最开始的时候可以很好地对输入进行匹配和分割,但在最后的日期这一块出现了问题,因为最开始就将输入中所有的空格都去掉了,然后最后在在对月份和时间的分割中出现了错误,会将时间分割错误,最后还是用开始不去括号,再将分割好的数据存入数组的时候对其他的数据进行去括号,而日期这一项不进行去括号,这才使得结果没有错误;ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。
LinkedList则是顺序访问比较快,Iterator中的next()方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。
4.改进建议:
在编写代码时,写了很多的垃圾代码,就是那种起不到一点作用的代码,希望之后可以改进并提高自己代码的效率。
5.总结:三次题目集学习到了很多新的东西,在这次训练中最重要的还是学到了正则表达式和类,这是我认为这几次作业中最重要的东西。然后正则表达式和类还要继续深入学习和练习,因为自己现在用到的都只是一些皮毛。知道了自己对于多态性和接口的掌握不是很好,需要进一步的学习其次对于老师的指导,我想说的是:感觉自己上课的时候效果不是很好,可能是自己的关系吧,但还是感觉听老师讲的时候感觉不是很适应,这个我会自己好好适应适应。对于课程和作业没有什么要说的,觉得还可以。但我觉得课下的时候可以我们几个班自己搞一些编程有关的活动用来提高大家的积极性,虽然说很多东西都靠自觉,但这也可能会提高一些学生的兴趣

浙公网安备 33010602011771号