201621123062《java程序设计》第九周作业总结
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。
思维导图1:(对集合部分做了一些改动和细化)
思维导图2:(泛型)
1.2 选做:收集你认为有用的代码片段
代码片段1:(取自PPT)
使用迭代器删除元素:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> iterator = list.iterator();
System.out.println(list);
while (iterator.hasNext()) {
iterator.next(); iterator.remove();
}
System.out.println(list);
运行截图:
代码片段2:(取自PPT)
Set(集)-HashSet:
Set<String> strSet = new HashSet<>();
strSet.add("1");
strSet.add("z");
strSet.add("2");
strSet.add("a");
strSet.add("1");
for (String e : strSet) {
System.out.println(e);
}
运行截图:
觉得很奇怪为什么运行结果元素的输出顺序没有按照代码里的顺序,后面问了一个大佬,说是因为HashSet里面是无序的,它是按元素的哈希值来决定他的顺序
2. 书面作业
本次作业题集集合
2.1.List中指定元素的删除(题集题目)
2.1.1 实验总结。并回答:列举至少2种在List中删除元素的方法。
方法:
public E remove(int index)
:移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。
public void clear()
:从此列表中移除所有元素。
总结:这一题整体还是比较简单的,做的时候主要的问题是在对输入的字符串处理的时候,一开始我想要把输入的字符串转化成字符数组,但是如果使用tocharArray()方法转化以后,我不知道怎么实现题目的以空格(单个或多个)为分隔符,将line中的元素抽取出来,放入一个List
这个要求,后来是看到群里有同学用了split方法,于是百度了一下这个方法:
split是分割的意思,主要是将字符串按照指定的符号分割成一个数组
然后就直接使用了这个方法解决了问题。
2.2 统计文字中的单词数量并按出现次数排序(题集题目)
2.2.1 伪代码(不得复制代码,否则扣分)
步骤:
1.根据上一题,已经做好了单词数量的统计,虽然本题不用字母排序但还是为了方便沿用上一题TreeSet
2.要改变的是需要统计每个单词出现的次数,考虑用HashMap实现对每一个单词进行次数统计
3.重写Collections中的sort方法,对集合中的每个单词次数进行比较并排序
4.输出
2.2.2 实验总结
总结:
这一题感觉做起来比较难,特别是第二步的实现。虽然想用HashMap数据类型但是不知道用什么方法,后来是参考同学的代码,发现可以用containsKey的方法进行单词次数统计。
2.3倒排索引(题集题目)
本题较难,做不出来不要紧。但一定要有自己的思考过程,要有提交结果。
2.3.1 截图你的代码运行结果
运行结果1:
2.3.2 伪代码(不得复制代码,否则扣分)
步骤:
文本的输入与行数的处理:
1.将文本按行读入,用一个动态数组存放每行输入的文本
2.在每一行文本输入的时候,定义一个字符串数组,利用split函数做字符串的分隔,并定义一个变量用于标记行数。
map映射表的建立:(key:字符串 value:对应行数)
3.遍历数组
4.建立单词第一次出现的map映射以及修改单词非第一次出现的map映射
5.打印索引表
查询单词输出对应单词行数:
6.输入的字符串文本依然做分隔
7.处理输入一个,两个,多个单词时的情况。---->定义两个动态数组,一个数组用于第一个单词的行数记录,第二个数组用于求后续遍历到的不同单词与第一个单词的行数的交集情况。
8.输出
2.3.3 实验总结
总结:
这一题对我来说难度较大,题目就看了很久,没有什么思路。首先要做的肯定是处理行数的输入和标记问题,后来一个做出来的舍友说可以用两个数组去解决,外面的动态数组存放输入一行的字符串,再用一个数组做动态数组分隔后的单词数组。于是我就用了这个方法。还有一个问题就是在处理单词交集的问题上,当时想的是第一个数组固定存放一个单词行数不变,第二个数组要不断变化,求和第一个数组的交集。于是我就以为第一个数组不需要使用动态的,但是我忽略了第一个数组是要存放单词对应的行数,不确定输入的单词对应行数有几个,数据还是动态变化的,其实两个都是要用动态数组。
至于后面的运行结果。。。也是试了很多种可能.
例如1:
输入了一个文本里面没有的,程序没有反应,后面发现遗漏了一个考虑点:
例如2:
这个我发现跟输出的答案不一样,但是PTA居然让我过了。。。然后我查了一下,是因为在第一个for里面我加了{},然后导致后面的循环有点乱,多打印出来一些东西。。。。(对于这种问题真的是很无解,因为这个错误找了两三个小时::>-<::)
2.4Stream与Lambda
编写一个Student类,属性为:
private Long id; private String name; private int age; private Gender gender;//枚举类型 private boolean joinsACM; //是否参加过ACM比赛
创建一集合对象,如List
2.4.1 使用传统方法编写一个搜索方法List search(Long id, String name, int age, Gender gender, boolean joinsACM),然后调用该方法将id>某个值,name为某个值, age>某个值, gender为某个值,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。(截图:出现学号、姓名)
部分代码:
运行截图:
2.4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的代码,并测试(要出现测试数据)。构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,你编写的方法应该能处理这些null而不是抛出异常。(截图:出现学号)
关键代码:
List<Student> students=stuList.stream().filter(stu1->stu1!=null&&stu1.getId()>10L&&stu1.getName().equals("zhang")&&stu1.getAge()>20&&stu1.getGender().equals(Gender.girl)&&stu1.isJoinsACM()).collect(Collectors.toList());
运行截图:
2.5泛型类:GeneralStack
题集jmu-Java-05-集合之GeneralStack
2.5.1 GeneralStack接口的代码
接口代码:
interface GeneralStack {
public Object push(Object item);
public Object pop();
public Object peek();
public boolean empty();
public int size();
}
2.5.2 结合本题与以前作业中的ArrayListIntegerStack相比,说明泛型有什么好处
好处:ArrayListIntegerStack直接限定了数据类型是Integer类型的,而使用泛型方法,定义了GeneralStack接口,接口中的操作对任何引用类型的数据都适用,我认为这样的方式更加灵活,也可以避免强制转换带来的风险。
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
排名图:
PTA提交列表图:
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周数 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
1 | 57 | 57 | 5027 | 5027 |
2 | 400 | 400 | 10 | 10 |
3 | 508 | 508 | 23 | 13 |
5 | 609 | 609 | 31 | 8 |
6 | 612 | 612 | 40 | 9 |
7 | 584 | 584 | 46 | 6 |
8 | 432 | 432 | 50 | 4 |
9 | 620 | 620 | 56 | 6 |
10 | 468 | 468 | 60 | 4 |
自己的目标能实现吗?
基本可以。。。。
4. 评估自己对Java的理解程度
尝试从以下几个维度评估自己对Java的理解程度
维度 | 程度 |
---|---|
语法 | PTA的题目大部分可以搞定,一些比较难的语法还没有掌握,基本的语法有的会忘记 |
面向对象设计能力 | 基本可以使用面向对象思想为所要解决的问题建模,但是有的时候要想很久 |
应用能力 | 可以使用Java编写一些x小程序 |
至今为止代码行数 | 4290 |