1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容。
2. 书面作业
本次作业题集集合
1. List中指定元素的删除(题集题目)
1.1 实验总结。并回答:列举至少2种在List中删除元素的方法。
总结:在做这道题的时候我是通过for循环正向遍历进而删除的,刚开始没注意到删除一个元素时i的变化导致答案错误,思考之后发现每删除一个元素i的值都要减一。
以该题为例列举了三种删除方法:
- 方法一
public static void remove1(List<String> list, String str) {
for (int i = 0; i < list.size(); i++)
if (list.get(i).equals(str)) {
list.remove(i);
i -= 1;
}
分析:该方法是通过正向遍历删除某一元素的,每删除一个元素i的值减一。
方法二
public static void remove2(List<String> list, String str) {
for(int i=list.size()-1;i>=0;i--) {
if (list.get(i).equals(str)) {
list.remove(i);
}
}
}
分析:该方法通过逆向遍历删除某一元素,此时i的值不受影响。
方法三
public static void remove3(List<String> list, String str) {
Iterator iterator=list.iterator();
while(iterator.hasNext()) {
if(iterator.next().equals(str)) {
iterator.remove();
}
}
}
分析:使用迭代器进行删除要方便很多,但是要注意remove()之前要有next()。
其他
也可以用stream(), filter(), collect()进行过滤,从而达到删除的目的。
补充: Iterator实现原理
2. 统计文字中的单词数量并按出现次数排序(题集题目)
2.1 伪代码(不得复制代码,否则扣分)
创建TreeMap对象
进入循环按行读入字符串,以!!!!!跳出循环。
对每行字符串使用split("\s+")分割。
判断单词是否存在,不存在则加入,value置为1,存在则不加入,value+1;输出该对象的长度。
创建List对象:List<Entry<String,Integer>> list=newArrayList<Map.Entry<String, Integer>>(map.entrySet());
使用Collection.sort对List对象进行排序,按照value进行升序。
使用Entry<String,Integer>entry=list.get(i); entry.getKey() entry.getValue() 输出映射。
2.2 实验总结
总结:新学的知识点
Map.Entry: Map的内部接口,表示一个Map实体,即key-value键值对。内含有getKey(), getValue方法。
3. 倒排索引(题集题目)
3.1 截图你的代码运行结果
3.2 伪代码(不得复制代码,否则扣分)
创建两个TreeMap对象:wordMap,key为单词value为ArrayList对象存放单词所在行数;rowMap,key为具体的行数,value为该行的内容。
按一行一行的去读取字符串,将字符串进行分割,把分割出来的单词放入wordMap,如果单词不存在则加入wordMap,生成新的ArrayList对象将当前行数加入,如果单词存在则取出value,判断当前行数是否在value中,若不在则加入,遇到!!!!!时结束读取。
使用wordMap.forEach((key, value) -> System.out.println(key + "=" + value));输出单词即对应的行数。
接收查询关键字,对查询关键字进行分割,通过for循环遍历每个单词,找出所有单词共有的行数。
输出共有的行数。
3.3 实验总结
总结:因为是用List存放行数信息,可能会有重复的行数出现,过程中排除重复的行数就可以了。
4.Stream与Lambda
编写一个Student类,属性为:
private Long id;
private String name;
private int age;
private Gender gender;//枚举类型
private boolean joinsACM; //是否参加过ACM比赛
创建一集合对象,如List
4.1 使用传统方法编写一个搜索方法List<Student> search(List<Student> stuList, Long id, String name, int age, Gender gender, boolean joinsACM)
,然后调用该方法将id>某个值,name为某个值, age>某个值, gender为某个值,参加过ACM比赛的学生筛选出来,放入新的集合。在main中调用,然后输出结果。(截图:出现学号、姓名)
具体代码
public static List<Student> search1(List<Student> studentList,Long id, String name, int age, Gender gender, boolean joinsACM) {
List<Student> ACMStudents = new ArrayList<>();
Student s = new Student(id, name, age, gender, joinsACM);
for (int i = 0; i < studentList.size(); i++) {
if (studentList.get(i) != null) {
if (joinsACM == true) {
if (studentList.get(i).equals(s)) {
ACMStudents.add(s);
}
}
}
}
return ACMStudents;
}
输入数据:
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(001l, "张三", 18, Gender.MAN, true));
studentList.add(new Student(002l, "李四", 18, Gender.MAN, false));
studentList.add(null);
studentList.add(new Student(003l, "王二", 18, Gender.MAN, true));
studentList.add(null);
studentList.add(new Student(004l, "麻子", 18, Gender.MAN, false));
Student.search2(studentList,001l, "张三", 18, Gender.MAN, true)
输出数据:
周文华 201621123008
[Student [id=1, name=张三, age=18, gender=MAN, joinsACM=true]]
4.2 使用java8中的stream(), filter(), collect()编写功能同4.1的代码,并测试(要出现测试数据)。构建测试集合的时候,除了正常的Student对象,再往集合中添加一些null,你编写的方法应该能处理这些null而不是抛出异常。(截图:出现学号)
函数代码
public static List<Student> search2(List<Student> studentList,Long id, String name, int age, Gender gender, boolean joinsACM){
Student s = new Student(id, name, age, gender, joinsACM);
List<Student> ACMStudents = studentList.stream().filter(e->e!=null&&e.equals(s)).collect(Collectors.toList());
return ACMStudents;
}
输入数据同上
输出数据:
周文华 201621123008
[Student [id=1, name=张三, age=18, gender=MAN, joinsACM=true]]
5. 泛型类:GeneralStack
题集jmu-Java-05-集合之GeneralStack
5.1 GeneralStack接口的代码
interface GeneralStack<E>{
public E push(E item);
public E pop();
public E peek();
public boolean empty();
public int size();
}
5.2 结合本题与以前作业中的ArrayListIntegerStack相比,说明泛型有什么好处
分析:之前都是建立一个Integer类型的数组,只能存放Integer类型的数据,这就有了局限性,如果想存入String类型的就不可以,使用泛型之后就使的代码更具有适用性了;我们在使用ArrayList时其内部采用Object数组存储,如果不指定类型,后面就要自己再进行强制类型转换,指定类型之后就消除了强制类型转换,也提高了类型安全。
6. 选做:泛型方法
基础参考文件GenericMain,在此文件上进行修改。
6.1 编写方法max,该方法可以返回List中所有元素的最大值。List中的元素必须实现Comparable接口。编写的max方法需使得String max = max(strList)
可以运行成功,其中strList为List 类型。也能使得Integer maxInt = max(intList);
运行成功,其中intList为List 类型。注意:不得直接调用Collections.max函数。
函数代码
public static <T extends Comparable<T>> T max(List<T> list) {
T max = list.get(0);
for (int i = 0; i < list.size(); i++) {
if (max.compareTo(list.get(i)) < 0)
max = list.get(i);
}
return max;
}
测试代码
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);
System.out.println(max(intList));
List<StuUser> stuList=new ArrayList<>();
stuList.add(new StuUser(10, "10"));
stuList.add(new StuUser(10, "11"));
stuList.add(new StuUser(13, "20"));
stuList.add(new StuUser(13, "11"));
System.out.println(max1(stuList));
输出结果
4
4
6.2 选做:现有User类,其子类为StuUser,且均实现了Comparable接口。编写方法max1,基本功能同6.1,使得User user = max1(stuList);
可以运行成功,其中stuList为List 类型。也可使得Object user = max(stuList)
运行成功。
函数代码
public static <T extends StuUser> T max1(List<T> list) {
T max=list.get(0);
for (int i = 0; i < list.size(); i++) {
if (max.compareTo(list.get(i)) < 0)
max = list.get(i);
}
return max;
}
测试代码
List<StuUser> stuList=new ArrayList<>();
stuList.add(new StuUser(10, "10"));
stuList.add(new StuUser(10, "11"));
stuList.add(new StuUser(13, "20"));
stuList.add(new StuUser(13, "11"));
System.out.println(max1(stuList));
List<Object> objList=new ArrayList<>();
objList.add(stuList);
System.out.println(max1(stuList));
输出结果
StuUser [no=20, toString()=User [age=13]]
StuUser [no=20, toString()=User [age=13]]
6.3 选做:编写int myCompare(T o1, T o2, Comparator c)
方法,该方法可以比较两个User对象,也可以比较两个StuUser对象,传入的比较器c既可以是Comparator ,也可以是Comparator 。注意:该方法声明未写全,请自行补全。
函数代码
public static <T extends User> int myCompare(T o1,T o2,Comparator<T> c) {
return c.compare(o1, o2);
}
测试代码
User user1=new User(5);
User user2=new User(20);
System.out.println(myCompare(user1, user2, new UserReverseComparator()));
StuUser stu1=new StuUser(10, "10");
StuUser stu2=new StuUser(10, "12");
System.out.println(myCompare(stu1, stu2, new StuUserComparator()));
输出结果
15
-2
7. 选做:逆向最大匹配分词算法
集合实验文件中的第07次实验(集合).doc文件,里面的题目6.
7.1 写出伪代码(不得直接复制代码)
伪代码
将词表放入HashSet。
创建一个ArrayList对象用于存储该句子中词。
设置一个front指针,初始化为0;
进入循环:while (sentence.length() != 0)
设置最大词长度:maxLength = sentence.length();
令String temp = sentence.substring(front, maxLength);
如果temp在词表中存在则加入2所创建的ArrayList对象,将temp删除:sentence = sentence.replace(temp, "");,将front置为0;如果在词表中不存在则front+1,进行front>=maxLength判断,为true跳出循环。
逆向输出ArrayList对象中的内容。
源代码
public static void main(String[] args) {
Set<String> wordsSet = new HashSet<>();
Scanner sc = new Scanner(System.in);
String[] words = sc.nextLine().split("\s+");
for (String str : words) {
wordsSet.add(str);
}
while (true) {
List<String> newList = new ArrayList<>();
String sentence = sc.nextLine();
int front = 0;
while (sentence.length() != 0) {
int maxLength = sentence.length();
String temp = sentence.substring(front, maxLength);
if (wordsSet.contains(temp)) {
newList.add(temp);
sentence = sentence.replace(temp, "");
front = 0;
} else {
front += 1;
if(front>=maxLength)
break;
}
}
if (newList.size() > 0) {
System.out.print(newList.get(newList.size() - 1));
if (newList.size() > 2)
for (int i = newList.size() - 2; i >= 0; i--)
System.out.print(" " + newList.get(i));
}
System.out.println();
}
}
7.2 截图你的代码运行结果。
3.码云及PTA
题目集:jmu-Java-05-集合
3.1. 码云代码提交记录
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
自己的目标能实现吗?
周次 | 总代码量 | 新增文件代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 665 | 20 | 20 | 20 |
2 | 1705 | 23 | 23 | 23 |
3 | 1834 | 30 | 30 | 30 |
4 | 1073 | 1073 | 17 | 17 |
5 | 1073 | 1073 | 17 | 17 |
6 | 2207 | 1134 | 44 | 27 |
7 | 3292 | 1085 | 59 | 15 |
8 | 3505 | 213 | 62 | 3 |
9 | 8043 | 1246 | 153 | 16 |
10 | 8606 | 543 | 167 | 14 |
4. 评估自己对Java的理解程度
- 尝试从以下几个维度评估自己对Java的理解程度
维度 | 程度 |
---|---|
语法 | 还有很多的语法需要去学习,还需要多加练习。 |
面向对象设计能力 | 这方面做的也不是很好,可能只会一些基本的吧,要学习的地方太多太多太多 |
应用能力 | 感觉自己只是学到了一点皮毛,更深的知识和技术都还没学到,不知道自己能不能做的出来 |
至今为止代码行数 | 8606 |