1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。
1.2 选做:收集你认为有用的代码片段
集合与泛型综合示例
import java.util.ArrayList;
import java.util.Iterator;
/*
* 创建一个集合,实体用ArrayList实现。
* 然后向集合添加5个字符串元素。
* 分别是:“hello”,“world”,“fujian”,“xiamen”,“ketang”。
* 判断集合中是否存在"ketang"这个元素?
*/
public class ArrayListDemo {
public static void main(String[] args) {
// 创建ArrayList对象
ArrayList<String> list = new ArrayList<String>();
// 向ArrayList对象添加元素
list.add("hello");
list.add("world");
list.add("fujian");
list.add("ketang");
list.add("xiamen");
// 定义一个变量,用于存储需要查找的对象
String string = new String("ketang");
// 定义一个变量,用于接收返回值
boolean flag = findElement(list, string);
// 打印
System.out.println("list集合中包含"" + string + ""吗?" + flag);
printArrayList(list);
}
/**
* 这是一个遍历集合的方法。
*
* @param list
* 集合
*/
private static void printArrayList(ArrayList<String> list) {
// //使用增强for循环,遍历集合
// for (Object object : list) {
// System.out.println((String)object);
// }
// 创建迭代器
Iterator<String> it = list.iterator();
System.out.println("集合中的元素有:");
// 使用迭代器,遍历集合
// hasNext(),如果指针后面还有元素,将返回true。若没有,返回false
while (it.hasNext()) {
String str = it.next();
System.out.print(str + " ");
}
}
/**
* 这是一个查找集合中是否有指定对象
*
* @param list
* 指定集合
* @param string
* 指定对象
* @return 返回是否存在
*/
private static boolean findElement(ArrayList<String> list, String string) {
boolean flag = list.contains(string);
return flag;
}
}
2. 书面作业
本次作业题集集合
1.List中指定元素的删除(题目4-1)
1.1 实验总结
在代码中,删除元素后,需要把下标减一。这是因为在每次删除元素后,ArrayList会将后面部分的元素依次往上挪一个位置(就是copy),所以,下一个需要访问的下标还是当前下标,所以必须得减一才能把所有元素都遍历完。
2.统计文字中的单词数量并按出现次数排序(题目5-3)
2.1 伪代码(简单写出大体步骤)
//读取
Map<String,Integer> map = new HashMap<>();
Scanner in = new Scanner(System.in);
while (in.hasNext())
{
String word = in.next();
if(String word.equals("!!!!!")) break;
.......
}
//排序
List<Map.Entry<String, Integer>> arraylist = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(arraylist,new Comparator<Map.Entry<String, Integer>>(){
public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2)
{
return ((Integer) obj2.getValue()).compareTo((Integer) obj1.getValue());
}
});
// 输出次数前10的单词
List<Map.Entry<String, Integer>> list = arraylist.subList(0, 20);
for (Map.Entry<String, Integer> item : list)
System.out.println(item.getKey() + "=" + item.getValue());
}
2.2 实验总结
统计一篇文章中单词出现的次数,要存储单词和次数,根据次数排序输出,要用Map数据结构保存键值对。首先想到是用TreeMap<String, Integer>,它为有序映射表,但默认按照键Key排序,要让Map按照Value值排序,难以直接实现,所以用先存储再排序的方法。先用HashMap<String, Integer>存储单词和单词的次数,利用Map的entrySet()方法获取映射关系视图,再由此构建ArrayList<Map.Entry<String, Integer>>,最后用Collections.sort()方法,自定义一个比较Integer的comparator,对该ArrayList排序。
3.倒排索引(题目5-4)
3.1 截图你的提交结果(出现学号)
3.2 伪代码(简单写出大体步骤)
3.3 实验总结
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中调用,然后输出结果。
4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的函数,并测试。
4.3 构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,然后重新改写4.2,使其不出现异常。
5.泛型类:GeneralStack(题目5-5)
5.1 截图你的提交结果(出现学号)
5.2 GeneralStack接口的代码
interface GeneralStack <T>
{
public T push(T e);
public T pop();
public T peek();
public boolean empty();
public int size();
}
5.3 结合本题,说明泛型有什么好处
A、安全机制
B、将运行时期的ClassCastException类型转换异常,转移到编译时期。
C、泛型技术,是给编译器使用的技术。
D、解决了强制转换的麻烦。
F、优化程序设计
6.泛型方法
基础参考文件GenericMain,在此文件上进行修改。
6.1 编写方法max,该方法可以返回List中所有元素的最大值。List中的元素必须实现Comparable接口。编写的max方法需使得String max = max(strList)可以运行成功,其中strList为List类型。也能使得Integer maxInt = max(intList);运行成功,其中intList为List类型。
6.2 选做:现有User类,其子类为StuUser,且均实现了Comparable接口。编写方法max1,基本功能同6.1,并使得max1(stuList);可以运行成功,其中stuList为List类型。
6.3 选做:编写int myCompare(T o1, T o2, Comparator c)方法,该方法可以比较User对象及其子对象,传入的比较器c既可以是Comparator,也可以是Comparator。注意:该方法声明未写全,请自行补全。
7.选做:逆向最大匹配分词算法
集合实验文件中的第07次实验(集合).doc文件,里面的题目6.
7.1 写出伪代码
7.2 实验总结
8.选做:JavaFX入门
完成其中的作业1、作业2。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2. PTA实验
函数(4-1),编程(5-3,5-4,5-5)
实验总结已经在作业中体现,不用写