PTA与参考资料
集合预习课件
集合实验文件
Java 8-Lambda表达式、方法引用、标准函数接口与流操作、管道操作之间的关系
第1次实验
PTA 6.1 ListIntegerStack(课堂演示)
可演示: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); //为什么这句会错误?
讲解:
- 通过JDK文档查看Queue接口的实现类。
- 通过JDK文档比较offer、poll、peek与add、remove、element方法的区别。
可演示:ctrl+shift+o
快速导入所需包, ctrl+2
自动生成变量。
思考:可否直接使用LinkedList<String> queue = new LinkedList<>();
实现队列所需功能?
PTA 6.3 统计一段英文中的不同单词的个数并按单词的字母顺序排序后输出(课堂演示)
快速测试技巧:
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)。
PTA 6.4 统计文字中的单词数量并按出现次数排序(课堂演示)
一般来说统计的时候应该采用什么接口?List、Set、Queue还是Map?
- Map的Key, Value分别应该是什么类型?
- 怎么判断Map中的的keySet中是否存在某个单词?如果单词不存在,怎么放入Map?
- 怎么对value进行排序?
Collections
仅能对List进行排序,怎么将EntrySet转化为List (List有一个构造函数,可以接收Set)?如何对List进行排序? - 使用Collections.sort进行排序,如何对键值对的值进行排序?
- 在IDE中如何快速生成匿名内部类(如Comparator)?
alt+/
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);
}
如上代码可以测试通过,但并不好。请分析其事件复杂度。
其他:
读取单词到ListScanner lineScanner = new Scanner(line)
,然后使用lineScanner的next方法。可以忽略词与词之间空格、多个空格。
从头到尾删要注意什么?
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("结束测试");
}
}
参考资料:
- 单元测试之JUnit5入门,这篇文章不用看前面的Maven相关内容,直接看里面的编写单元测试,先看懂
@Test
、@BeforeAll
与@BeforeEach
这几个注解。 - junit5 入门系列教程
PTA 6.5 倒排索引(自主完成)
PTA 6.6 GeneralStack(自主完成)
简单讲解:泛型接口、泛型类的意义。
本章特别加分任务(自主完成)
实验任务书中的“倒排索引(PTA)”、“逆向最大匹配分词算法”。
请为你的程序编写若干方法,比如:
对于“倒排索引”题目
请至少编写如下几个方法:
- 建立索引 createIndex
- 打印索引 printIndex
- 检索 queryIndex
对于“逆向最大匹配分词算法”,请至少编写:
- List
split(String line, Set words) //对lines使用词表words进行分词
编写好以后,请直接给老师演示并讲解清楚。
参考资料