201621123008 《Java 程序设计》 第九周学习总结

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
原文地址:https://www.cnblogs.com/Dzwh/p/7841477.html