打開小小輸入法的鄭碼錶觀察,如
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();
}
}
}
}
運行結果如下: