首页 > 技术文章 > Java第06次实验提纲(集合框架)

zhrb 2017-04-04 22:42 原文

PTA与参考资料

集合预习课件
集合实验文件

第1次实验

PTA 6.1 ArrayListIntegerStack(课堂演示)

可演示:jdk中的javadoc文档注释/**

javadoc:javadoc技术可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。

注1:不要导入java.awt.List,应导入java.util.List

思考:是否一定要指定栈中的元素类型?进一步引入泛型。

PTA 6.2 银行业务队列简单模拟(课堂演示)

Queue<String> q = new Queue<>();

可以成功吗?为什么?

LinkedList<Integer> queue = new LinkedList<>();
queue.addLast(1);
Queue<String> q = new LinkedList<>();
q.addLast(1);   #为什么这句会错误?

讲解:

  1. 通过JDK文档查看Queue接口的实现类。
  2. 通过JDK文档比较offer、poll、peek与add、remove、element方法的区别。

可演示:ctrl+shift+o 快速导入所需包, ctrl+2 自动生成变量。

思考:可否直接使用LinkedList<String> queue = new LinkedList<>();实现队列所需功能?

PTA 6.3 统计一段英文中的不同单词的个数并按单词的字母顺序排序后输出(课堂演示)

采用什么结构?List、Set、Queue还是Map?
如果使用Map,key是什么、Value是什么?
如何遍历Map的entrySet()?forEach, iterator
如何对所有单词进行排序?实际上是对Map的keySet中的值进行排序,可使用Collections.sort。

快速测试技巧:

String str = "将PTA中的输入样例直接粘贴到Eclipse的双引号之间,并删掉多余的字符";
//Scanner sc = new Scanner(System.in); //然后把System.in改成str,如下所示
Scanner sc = new Scanner(str);  //Scanner可直接对字符串处理
//其他代码

接下来测试的时候,就直接运行。无需在控制台手动粘贴输入样例。
注意:在PTA提交的时候。需要将Scanner(str)改成Scanner(System.in)。

1.4 尝试使用Java集合类中的LinkedList代替栈,来判断一个字符串是否是回文。(自主完成)

  • 简单讲解:使用栈判断回文的原理。
  • 简单讲解:使用LinkedList中的哪两个方法来代替入栈与出栈。

第2次实验

f6.1 List中指定元素的删除

如下代码不能实现在List中删掉指定元素?如何改进?

List<Integer> xList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
	xList.add(i);
}
//如下代码不能实现:删除掉xList中所有小于3的元素。
for (int i = 0; i < xList.size(); i++) {
	if (xList.get(i) < 3)
		xList.remove(i);
}

解决方案:使用Iterator来进行集合中元素的删除。

常见问题:

while(list.contains(e)) {
    list.remove(e);
}

如上代码可以测试通过,但并不好。请分析其事件复杂度。

其他:
读取单词到List:Scanner lineScanner = new Scanner(line),然后使用lineScanner的next方法。可以忽略词与词之间空格、多个空格。
从头到尾删要注意什么?

PTA 6.4 统计文字中的单词数量并按出现次数排序(课堂演示)

  1. Map的Key, Value分别应该是什么类型?
  2. 怎么判断Map中的的keySet中是否存在某个单词?如果单词不存在,怎么放入Map?
  3. 怎么对value进行排序?Collections仅能对List进行排序,怎么将EntrySet转化为List (List有一个构造函数,可以接收Set)?如何对List进行排序?
  4. 在IDE中如何快速生成匿名内部类(如Comparator)?alt+/

JUnit5 入门

在ArrayList频繁删除元素真的慢吗?
都说LinkedList底层使用的是链表,所以删除元素相对ArrayList会快。但真的如此吗?
动起手来,做一个实验测试一下才是正道。
初始化相同大小(100万)的LinkedList与ArrayList,然后随机删除相同个数(10万)的元素,每回删除的位置也要相
思路:首先初始化LinkedList与ArrayList。然后编写两个方法,分别执行对LinkedList与ArrayList执行相同的删除操作,并统计每个方法的执行时间。
How:使用JUnit5来进行测试。主要使用@Test@BeforeAll这两个注解。注意:需在模块中添加JUnit5。
小练习:尝试比较在LinkedList、ArrayList、ArrayDeque上频繁(10万次)在表头删除、在表尾插入的效率。初始数据应该有100万。

如何在项目中启用JUnit5

首先需要先在项目中添加JUnit5相关的库文件。
如果项目未启用模块功能。一般来说可以新建JUnit Test Case的时候会提示你添加JUnit5。然后自动将JUnit5添加到Libraries中的Classpath。
如果项目启用了模块功能(即,在你的项目中包含module-info.java文件)。右键点击项目-Properties-Java Build Path-Libraries-Modulepath-Add Library...选择JUnit-选择JUnit 5。最后还需在module-info.java中添加requires org.junit.jupiter.api;

参考代码:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

class Main5Test {
	private static List<Integer> arrList = new ArrayList<>();
	private static List<Integer> lnkList = new LinkedList<>();
	private static int N = 1000000;//列表中元素个数,100w
	private static int M = 80000;  //删除次数,8w
	
	
	@BeforeAll
	static void init() {
		System.out.println("初始化代码,仅执行1次");
		for (int i = 0; i < N; i++) {
			arrList.add(1);
			lnkList.add(1);
		}
	}

	@Test
	void test() {
		//编写在LinkedList中频繁删除的代码
		System.out.println("在LinkedList中频繁删除");
		try {
			Thread.sleep(1354);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("结束测试");
	}
	
	@Test
	void test1() {
		//编写在ArrayList中频繁删除的代码
		System.out.println("在ArrayList中频繁删除");
		try {
			Thread.sleep(354);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("结束测试");
	}

}

参考资料:

  1. 单元测试之JUnit5入门,这篇文章不用看前面的Maven相关内容,直接看里面的编写单元测试,先看懂@Test@BeforeAll@BeforeEach这几个注解。
  2. junit5 入门系列教程

PTA 6.5 倒排索引(自主完成)

PTA 6.6 GeneralStack(自主完成)

简单讲解:泛型接口、泛型类的意义。

本章特别加分任务(自主完成)

实验任务书中的“倒排索引(PTA)”、“逆向最大匹配分词算法”。
请为你的程序编写若干方法,比如:
对于“倒排索引”题目
请至少编写如下几个方法:

  • 建立索引 createIndex
  • 打印索引 printIndex
  • 检索 queryIndex

对于“逆向最大匹配分词算法”,请至少编写:

  • List split(String line, Set words) //对lines使用词表words进行分词

编写好以后,请直接给老师演示并讲解清楚。

参考资料

有哪些比较好的中文分词方案?
结巴分词(java版) jieba-analysis

下次实验

Java第07次实验提纲(异常)

推荐阅读