一、前言
本次学习应用于文本处理方面,前面我们说到实现统计不同种类的字符频率
,本次目的是为了实现查询指定字词或统计全文字频。
在上一篇博客中我们讲到了正则表达式的实际应用。
在这里我们将要与数据打交道,所以我们将要学习JAVA中的“容器”(其中的Map接口
)。
二、分析学习(Map接口)
1)介绍和引入
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。
Map
就是用来存储“键(key)-值(value) 对”的。 Map
类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map
接口的实现类有HashMap
、TreeMap
、HashTable
、Properties
等。
- 常用方法:
2)特点和区别
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable
的方法添加了synchronized
关键字确保线程同步检查,效率较低。
HashMap与HashTable的区别
:
-
HashMap
: 线程不安全,效率高。允许key或value为null。 -
HashTable
: 线程安全,效率低。不允许key或value为null。
TreeMap是红黑二叉树的典型实现。 TreeMap的put()/remove()
方法大量使用了红黑树的理论。
TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap
效率高
于TreeMap;在需要排序的Map时才选用TreeMap
。
三、编程学习
1)任务要求
- 完成一个 java application应用程序,实现文本文档的读取和写入,将修改后(查询指定字词或统计全文字频)的新内容存入到新的文本文档中。
- 应用数据流的相关知识,使用
BufferedReader/BufferedWriter
处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。使用InputStreamReader/OutputStreamWriter
处理流:将字节流对象转化成字符流对象。 - 应用JAVA“容器”中的HashMap的知识进行字频查询和统计。
2)程序代码
/* 项目名称:Task_Shao
* 创建时间:2019年2月21日
* 创建者:Administrator_wz
* 创建地点:kmust
* 功能:文本处理中的特定字频统计(java 排序容器HashMap统计方法)
*/
import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
import java.util.regex.Matcher;//导入java.util包中的Matcher类
import java.util.regex.Pattern;//导入java.util包中的Pattern类
public class character_frequency_statistics {
//创建类名
public static void main(String[] args) throws IOException {
//程序的主函数入口
long startTime=System.currentTimeMillis();//定义开始时间,用于统计程序的运行时长
try{
//用try-catch语句将逻辑语句包起来,并读取指定的文件
Scanner s1 = new Scanner(System.in);//获取键盘输入并赋值给s1字符串
System.out.println("请输入想要打开的文本文档:");//输入提示信息
String a = s1.nextLine();//定义字符串变量,并赋值为用户输入的信息
InputStreamReader isr = new InputStreamReader(new FileInputStream(a),"utf-8"