打开小小输入法的郑码表观察,如
a 一 再
aa 一下
aaam 万无一失
aaav 可歌可泣
aaax 天下无难事
aacf 百无聊赖
aacm 无可奉告
aadj 无可挽回
aadt 殊死搏斗
aaeu 平型关
aaez 一开始
。。。
改造上次你已完成的“编程实现一个命令窗程序,使得输入“你”则在屏上回显“you”的那个程序”,使得能进行郑码查询,如输入aacm,则输出“无可奉告”。以如下两种方法:
1)将码表放在一个文本文件中,如zmb.txt中,实现以上功能。
2)将码表放在SQLite文件中,如zmdb. sqlite, 再次以上功能。
第一种方法:
将以下内容输入到记事本中 保存为zmb.txt
<a><一再>
<aa><一下>
<aaam><万无一失>
<aaav><可歌可泣>
<aaax><天下无难事>
<aacf><百无聊赖>
<aacm><无可奉告>
<aadj><无可挽回>
<aadt><殊死搏斗>
<aaeu><平型关>
<aaez><一开始>
下面的代码用来实现上述的功能
import java.io.BufferedReader;//导入java.io包中的BufferedReader类
import java.io.FileReader; //导入java.io包中的FileReader类
import java.io.IOException; //导入java.io包中的IOException类
import java.util.Scanner; //导入java.util包中的Scanner类
class dic { //定义一个类,类名为dic
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 china = s.substring(s.indexOf("<")+1, s.indexOf(">"));
//substring(int beginIndex, int endIndex)
//返回一个字符串的子串,从beginIndex开始到endIndex结束(含头不含尾)
//indexOf(String str)
//返回指数在这个字符串指定的子字符串中第一个出现的下标。
String english = s.substring(s.lastIndexOf("<")+1,s.lastIndexOf(">"));
//lastIndexOf(String str)
//返回指数在这个字符串的指定子字符串中最后出现的下标。
if(str.equals(china)) {//存在
System.out.println(english);//输出对应的汉语意思
b = true;
}
}
if(str.equals("ByeBye")) {//判断是否输入的为"ByeBye"
System.out.println("程序退出!");
System.exit(0);//终止当前正在运行的程序
}
if(!b) {//查不到
System.out.println("查不到该词!");
}
}
}
}
运行结果如下:
第二种方法:
<a><一再>
<aa><一下>
<aaam><万无一失>
<aaav><可歌可泣>
<aaax><天下无难事>
<aacf><百无聊赖>
<aacm><无可奉告>
<aadj><无可挽回>
<aadt><殊死搏斗>
<aaeu><平型关>
<aaez><一开始>
将上述内容利用可视化数据库Navicat Premium导入student.db数据库的zmdb表格中,如下所示:
通过下面的代码连接数据库student.db,读取english和chinese字段下的值 将输入的字符串与读取到的english字段下的值进行比较如果相同,则输出对应的chinese字段下的值。完成郑码的查询
import java.sql.*; //导入java.sql包
import java.io.BufferedReader; //导入IO流BufferedReader类
import java.io.FileReader; //导入IO流FileReader类,
import java.io.IOException; //导入IO流IOException类,抛出或捕获异常信息
import java.util.Scanner;
public class Sqlite {
static Connection con; //声明Connection对象
static Statement sql; //声明Statement对象
static ResultSet res; //声明ResultSet对象
public Connection getConnection(){ //建立返回值为Connection的方法
try { //加载数据库驱动
Class.forName("org.sqlite.JDBC");
System.out.println("数据库驱动加载成功");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
try { //通过访问数据库的URL获取数据库连接对象
con=DriverManager.getConnection("jdbc:sqlite:student.db");
System.out.println("数据库连接成功");
System.out.print('\n');
}catch(SQLException e) {
e.printStackTrace();
}
return con; //按方法要求放回一个Connection对象
}
public static void main(String[] args)throws IOException {
Scanner scan = new Scanner(System.in);
Sqlite c = new Sqlite(); //创建本类对象
con =c.getConnection(); //与数据库建立连接
while(true) {
try {
sql = con.createStatement(); //实例化Statement对象
res = sql.executeQuery("select * from zmdb");
String str = scan.nextLine(); //定义字符型变量str并赋值
boolean flag = false; //定义布尔型变量flag
while(res.next()) { //读一行文本并赋值给word
String en = res.getString("english"); //获取english字段值
String ch = res.getString("chinese"); //获取chinese字段值
String english = en.substring(en.indexOf("<")+1,en.indexOf(">")); //截取字母
String chinese = ch.substring(ch.lastIndexOf("<")+1,ch.lastIndexOf(">")); //截取汉字
if(str.equals(english)) { //将输入字符与截取字母作比较
System.out.println(chinese);
flag = true; //能查找到对应便将flag置1
}
}
if(str.equals("ByeBye")) { //输入ByeBye退出程序
System.exit(0);
}
if(!flag) { //查找不到对应的词
System.out.println("查不到该词");
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
运行结果如下: