java实现郑码查询
一. 要求
打开小小输入法的郑码表观察,如:
a 一 再
aa 一下
aaam 万无一失
aaav 可歌可泣
aaax 天下无难事
aacf 百无聊赖
aacm 无可奉告
aadj 无可挽回
aadt 殊死搏斗
aaeu 平型关
aaez 一开始
。。。
编程实现一个命令窗程序,使得能进行郑码查询,如输入aacm,则输出“无可奉告”。
二.实现方式
java实现郑码查询(输入郑码编码输出相应汉字或词语)并通过控制窗口显示,本文总结对比了两种实现方式:
方式一:将码表放在一个文本文件中,如zmb.txt,实现以上功能。
方式二:将码表放在SQLite文件中,如zmdb. sqlite, 再次以上功能。
01. zmb.txt方式查询
1.1 建立zmb.txt文件
在java程序所在文件夹中创建一个zmb文本文件【zmb.txt】,使zmb.java程序和zmb.txt在同一路径下。
源代码:
import java.io.*;//导入java.io包中的相关类
import java.util.Scanner; //导入java.util包中的Scanner类
public class ZMB {
public static void main(String[] args) throws IOException { //main方法里有什么操作可能会发生IOException
Scanner scan = new Scanner(System.in); //定义一个Scanner对象,等待从键盘上输入
while(true) {
System.out.println("请输入一个郑码编码:"); //控制台输出“请输入一个郑码编码”
String str = scan.nextLine(); //定义一个字符串
FileReader fr = new FileReader("zmb.txt");//创建一个新的 FileReader,给予File读。
BufferedReader br = new BufferedReader(fr);//从一个字符输入流中读取文本
String s = null;//定义一个字符串
boolean b = false;//判断字典中是否含有输入的郑码编码
while((s = br.readLine()) != null) {//readLine()读一行文本
String zm = s.substring(s.indexOf("<")+1, s.indexOf(">"));
//substring(int beginIndex, int endIndex)
//返回一个字符串的子串,从beginIndex开始到endIndex结束(含头不含尾)
//indexOf(String str)
//返回指数在这个字符串指定的子字符串中第一个出现的下标。
String china = s.substring(s.lastIndexOf("<")+1,s.lastIndexOf(">"));
//lastIndexOf(String str)
//返回指数在这个字符串的指定子字符串中最后出现的下标。
if(str.equals(zm)) {//输入编码存在于文本则执行
System.out.println(china);//输出对应的词语
b = true;
}
}
if(str.equals("ByeBye")) {//判断是否输入的为"ByeBye"
System.out.println("程序退出!");
System.exit(0);//终止当前正在运行的程序
}
if(!b) {//查不到
System.out.println("没有收录此编码的汉字或词组!");
}
}
}
}
1.2 编译及运行
用editplus编写程序,通过【配置自定义文件】可设置编译运行快捷键
编译:ctrl+1
运行:ctrl+2
02. zmb.sqlite方式查询
java读取数据库内容具体过程参见:
https://blog.csdn.net/yangdan1025/article/details/80313158
2.1 创建zmdb数据库
在sqlite数据库中创建表,并将郑码表中的内容插入表中形成记录。
如何在sqlite3中创建数据库参见:
https://blog.csdn.net/yangdan1025/article/details/80280094
查询表记录可见:
2.2 java和数据库的连接
package sqlite;
import java.sql.*;//导入java.sql包中相关类
public class ZMB {
private static Connection connect()
{
Connection conn = null;//定义数据库连接对象
try {
String url = "jdbc:sqlite:C:/sqlite/zmdb.db"; //定义连接数据库的url(url:访问数据库的URL路径),test为数据库名称
Class.forName("org.sqlite.JDBC");//加载数据库驱动
conn = DriverManager.getConnection(url); //获取数据库连接
System.out.println("数据库连接成功!\n");//数据库连接成功输出提示
}
//捕获异常信息
catch (ClassNotFoundException | SQLException e) {
System.out.println("数据库连接失败!"+e.getMessage());
}
return conn;//返回一个连接
}
//定义一个main方法
public static void main(String[] args) {
connect();
}
}
2.3 java读取数据库
读取数据库源代码
package sqlite;
import java.sql.*;//导入java.sql包中相关类
//import java.io.*;//导入java.io包中相关类
import java.util.Scanner;
public class ZMB1 {
private Connection connect()
{
Connection conn = null;//定义数据库连接对象
try {
String url = "jdbc:sqlite:C:/sqlite/zmdb.db"; //定义连接数据库的url(url:访问数据库的URL路径),test为数据库名称
Class.forName("org.sqlite.JDBC");//加载数据库驱动
conn = DriverManager.getConnection(url); //获取数据库连接
System.out.println("数据库连接成功!\n");//数据库连接成功输出提示
}
//捕获异常信息
catch (ClassNotFoundException | SQLException e) {
System.out.println("数据库连接失败!"+e.getMessage());
}
return conn;//返回一个连接
}
public void selectAll() { //选择文本区中的所有文本,在 null 或空文档上不执行任何操作。
Connection conn = this.connect();//连接数据库
Scanner scan=new Scanner(System.in);//创建Scanner对象,控制台等待输入
String sql="Select *from zmb";//将从表中查询到的的所有信息存入sql
while(true){
System.out.println("请输入一个郑码编码:"); //控制台输出“请输入一个郑码编码”
try {
Statement stmt = conn.createStatement();//得到Statement实例
ResultSet rs = stmt.executeQuery(sql);//执行SQL语句返回结果集
String str=scan.nextLine(); //定义字符型变量str并赋值
boolean b = false;//判断表中是否含有输入的词
// 当返回的结果集不为空时,并且还有记录时,循环输出记录
while (rs.next()) { //读一行文本
String zmm=rs.getString("zm"); //获取zm字段值
String ch=rs.getString("chinese");
if(str.equalsIgnoreCase(zmm)) {//输入郑码编码存在于表记录则执行
System.out.println(ch);//输出对应的中文
b = true;
}
}
if(str.equals("ByeBye")) {//判断是否输入的为"ByeBye"
System.out.println("程序退出!");
System.exit(0);//终止当前正在运行的程序
}
if(!b) {//查不到
System.out.println("没有收录此编码的汉字或词组!");
}
}
catch (SQLException e) {
System.out.println("查询数据时出错!"+e.getMessage());
}
}
}
//定义main方法
public static void main(String[] args){
ZMB1 app = new ZMB1();//创建了一个INFOR对象
app.selectAll();//调用对象的selectAll方法
}
}
查询结果
小记
存在数据库中的数据最终还是存在文件中的,只是数据库提供一些存储结构,建一些索引等等,达到快速访问与存储的目的。要快速的访问数据,最主要的是数据的存储结构以及读取数据的方式的好坏,不管是在数据库中还是文件中,只要有好的存储结构以及读取数据的方式,它都可以快速的访问数据。