201521123082 《Java程序设计》第8周学习总结
201521123082 《Java程序设计》第8周学习总结
标签(空格分隔):Java
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。
1.2 选做:收集你认为有用的代码片段
关于泛型的基础知识和有用的代码片段解释可以参考:了解泛型
泛型应用--泛型接口、泛型方法、泛型数组、泛型嵌套的代码解释可以参考:Java泛型
2. 书面作业
1.List中指定元素的删除
题集jmu-Java-05-集合
之4-1
1.1 实验总结
Answer:
贴上函数代码块和解释:
//注释参考来自JDK6.0文档(老师提供的中文版)
/* covnertStringToList函数代码 */
private static List<String> convertStringToList(String line) {
Scanner input = new Scanner(line);
//实例化list
List<String> list = new ArrayList<String>();
while (input.hasNext()) {
//向列表的尾部添加指定的元素
list.add(input.next());
}
return list;
}
/* remove函数代码 */
public static void remove(List<String> list, String str) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
// next()返回迭代的下一个元素
String word = iterator.next();
if (word.equals(str)) {
//iterator.remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素
iterator.remove();
}
}
}
1.2 截图你的提交结果(出现学号)
Answer:
2.统计文字中的单词数量并按出现次数排序(尽量不要出现代码)
题集jmu-Java-05-集合
之5-3 统计文字中的单词数量并按出现次数排序
2.1 伪代码(简单写出大体步骤)
Answer:
//关键代码1
//实例化储存单词的map,并实现存放
Map<String, Integer> map = new TreeMap<String, Integer>();
while (input.hasNext()) {
String word = input.next();
if (word.equals("!!!!!"))
break;
//containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
else if (!map.containsKey(word))
//put(K key,V value)
map.put(word, 1);
else {
//get(K key,V value)
int n = (int) map.get(word);
map.put(word, n + 1);
}
}
System.out.println(map.size());
//关键代码2
List<Map.Entry<String, Integer>> arrayList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
//用Collections.sort()方法对arrayList存放Map的键值进行排序
Collections.sort(/*
.......
.......*/
);
//关键代码3
for (Map.Entry<String, Integer> entry : arrayList) {
/*
按要求输出
......
......
*/
}
2.2 实验总结
Answer:
在上面的代码中已经在关键处做了解释,学会善于运用map已经有的方法。
运行结果:
在查找JDK文档时觉得下面有意义的说明:
了解接口
Map<K,V>
:
K - 此映射所维护的键的类型
V - 映射值的类型
一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap类;另一些映射实现则不保证顺序,如 HashMap 类。
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。
引用来自:JDK6.0中文版
3.倒排索引(尽量不要出现代码)
题集jmu-Java-05-集合
之5-4
3.1 伪代码(简单写出大体步骤)
Answer:
//若干行英文,以!!!!!为结束,并且统计每个单词所在行数
while (input.hasNextLine()) {
String str = input.nextLine();
if (str.compareTo("!!!!!") == 0)
break;
word.add(str);
String word1[] = str.split(" ");
for (int i = 0; i < word1.length; i++) {
Set<Integer> num = new TreeSet<Integer>();
if (line.containsKey(word1[i])) {
num = line.get(word1[i]);
}
num.add(count);
line.put(word1[i], num);
}
count++;
m++;
}
//输入一行查询关键字,输出行集与行集内每一行的内容
while (input.hasNext()) {
/*
......
......*/
if (arr.size() == 0)
System.out.println("found 0 results");
else {
System.out.println(arr.toString());
int j;
for (int i = 0; i < arr.size(); i++) {
j = arr.get(i) - 1;
System.out.println("line " + arr.get(i) + ":"+word.get(j));
}
3.2 实验总结
Answer:
巩固了对TreeMap运用的熟练程度,学会了用split截取字符串来取得其中的关键字。
3.3 截图你的提交结果(出现学号)
Answer:
4.Stream与Lambda
编写一个Student类,属性为:
private Long id;
private String name;
private int age;
private Gender gender;//枚举类型
private boolean joinsACM; //是否参加过ACM比赛
创建一集合对象,如List,内有若干Student对象用于后面的测试。
4.1 使用传统方法编写一个方法,将id>10,name为zhang, age>20,gender为女,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。
Answer:
4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的函数,并测试。
Answer:
//关键代码:
List<Student> answer = list
.stream().filter(line -> line.getId() > 10
&& line.getName().equals("zhang") && line.getGender().equals(Gender.girl) && line.isJoinsACM())
.collect(Collectors.toList());
4.3 构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,然后重新改写4.2,使其不出现异常。
Answer:
//改进函数的关键代码:
List<Student> answer = list
.stream().filter(line -> line != null).filter(line -> line.getId() > 10
&& line.getName().equals("zhang") && line.getGender().equals(Gender.girl) && line.isJoinsACM())
.collect(Collectors.toList());
结果截图:
5.泛型类:GeneralStack
题集jmu-Java-05-集合
之5-5 GeneralStack
5.1 GeneralStack接口的代码
Answer:
interface GeneralStack
{
public Object push(Object item);
public Object pop();
public Object peek();
public boolean empty();
public int size();
}
5.2 结合本题,说明泛型有什么好处
Answer:
在学泛型之前,我只知道类和方法只能使用具体的类型。当需要多种类型的方法和类时,必须重写。以实验5来说,以前IntegerStack接口只能用于存放Integer类型的数据,但运用泛型的知识,写了通用的GeneralStack接口,对任何引用类型的数据都适用。
5.3 截图你的提交结果(出现学号)
Answer:
6.泛型方法
基础参考文件GenericMain,在此文件上进行修改。
6.1 6.1 编写方法max,该方法可以返回List中所有元素的最大值。List中的元素必须实现Comparable接口。编写的max方法需使得Stringmax=max(strList)
可以运行成功,其中strList为List<String>
类型。也能使得Integer maxInt =max(intList)
;运行成功,其中intList为List<Integer>
类型。
Answer:
max方法如下:
public static <T extends Comparable<T>> T max(List<T> list) {
T max = list.get(0);
for (T word : list) {
if (word.compareTo(max) > 0) {
max = word;
}
}
return max;
}
运行结果如下:
6.2 :现有User类,其子类为StuUser,且均实现了Comparable接口。编写方法max1,基本功能同6.1,并使得max1(stuList)
;可以运行成功,其中stuList为List<StuUser>
类型。
Answer:
方法max1和max方法的思想是相同的,只需稍作改变如下:
//实现Comparable接口
public static <StuUserComparator extends Comparable<StuUser>> StuUser max1(List<StuUser> stuList)
{
StuUser maxstu = stuList.get(0);
for (StuUser student : stuList) {
if ( student.compareTo( maxstu ) > 0 ){
maxstu = student;
}
}
return maxstu;
}
实现结果:
7.选做:逆向最大匹配分词算法
集合实验文件中的第07次实验(集合).doc文件,里面的题目6.
7.1 写出伪代码即可
Answer:
题目要求的说明如下:
实验说明:
输入格式:
第一行是词表,每个词之间以空格分隔。
接下来是若干行中文句子。
输出格式:
逆向最大匹配的分词结果,每个词之间使用空格分隔。每个输入对应一行输出。
输入样例:
词表:你 我 他 爱 北京 天安门 研究 研究生 命 生命 的 起源
句子1:研究生命的起源
句子2:我爱北京天安门
句子3:好朋友
输出样例:
句子1分词结果:研究 生命 的 起源
句子2分词结果:我 爱 北京 天安门
句子3分词结果:好 朋 友
我的想法:
将词表的单词存入哈希表;
然后输入句子,将句子的词与哈希表中的单词比较;
如果相同,存入一个新的list;
最后输出结合中的元素。
8.选做:JavaFX入门
完成其中的作业1、作业2。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。
Answer:
只是熟悉一下JavaFX,完成作业,将界面中文化:
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2. PTA实验
函数(4-1),编程(5-3,5-4,5-5)
实验总结已经在作业中体现,不用写。