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)
实验总结已经在作业中体现,不用写。

posted @ 2017-04-15 17:34  末日驿站  Views(322)  Comments(1Edit  收藏  举报