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,内有若干Student对象用于后面的测试。

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)可以运行成功,其中strListList类型。也能使得Integer maxInt = max(intList);运行成功,其中intListList类型。注意:不得直接调用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);可以运行成功,其中stuListList类型。也可使得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

最新文章

  1. 修复Linux Mint损坏的依赖
  2. Apache Shiro系列二,概述 —— 基本概念
  3. 1014 : Trie树 hihocoder
  4. 转:小白编译openwrt固件教程
  5. tomcat7源码编译过程以及问题解决
  6. NGUI例子Scroll View场景中item添加点击后自动滑到终点
  7. 我的第一个WCF程序,很简单适合我等菜鸟
  8. xcode简介
  9. VS2012更改项目编译后文件输出目录
  10. 深入浅出Nodejs读书笔记(转)
  11. iOS 之 系统机制
  12. BZOJ 1835: [ZJOI2010]base 基站选址(DP,线段树)
  13. Activity的setContentView的流程
  14. ASP.NET MVC 播放远程服务器上的MP3文件
  15. 3-4 计算属性的setter和getter
  16. day02 解释器安装及初识变量
  17. python制作电脑定时关机办公神器,另含其它两种方式,无需编程!
  18. nyoj-0613-免费馅饼(dp)
  19. Linux alias别名命令
  20. 利用组策略API 编辑GPO(Group Policy Object)

热门文章

  1. oracle RMAN使用
  2. vue 异步请求
  3. CSS 美化radio checkbox
  4. SQLMAP自动注入(三):参数介绍
  5. 【Scheme】序列的操作
  6. leetcode 链表类型题总结
  7. Django的几种缓存的配置
  8. WdatePicker控件Javascript取得当前时间、取得减30分钟时间
  9. Win10 安装 Anaconda3 用 Anaconda3 安装TensorFlow 1.2 (只支持python3.5)
  10. TZOJ 3663 最长路径(floyd)