java实现郑码查询

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方法
            }

        }


查询结果

这里写图片描述

小记

存在数据库中的数据最终还是存在文件中的,只是数据库提供一些存储结构,建一些索引等等,达到快速访问与存储的目的。要快速的访问数据,最主要的是数据的存储结构以及读取数据的方式的好坏,不管是在数据库中还是文件中,只要有好的存储结构以及读取数据的方式,它都可以快速的访问数据。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值