?? spellchecker.java
字號:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class spellChecker extends JFrame
implements KeyListener, ActionListener, ListSelectionListener
{
private JTextField jtf=new JTextField();
private static JList list=new JList();
private static JTextArea jta=new JTextArea();
private JButton button =new JButton(" 查詢 ");
private JScrollPane scrollPane1=new JScrollPane(list);
private static Vector wordVector=new Vector(); //存放英語單詞的向量
private static int[] searchIndex=new int[27]; //一級索引
private static Vector matchWordIndex=new Vector(); //存放找到的參考單詞所在向量中的位置
public spellChecker()
{
Container container =getContentPane();
container.setLayout(new BorderLayout());
JPanel jp1=new JPanel();
jp1.setLayout(new BorderLayout());
jp1.add(new JLabel(" 輸入 "),BorderLayout.WEST);
jp1.add(jtf,BorderLayout.CENTER);
jp1.add(button,BorderLayout.EAST);
container.add(jp1,BorderLayout.NORTH);
container.add(scrollPane1,BorderLayout.WEST);
JScrollPane scrollPanel2=new JScrollPane(jta);
jta.setEditable(false);
container.add(scrollPanel2,BorderLayout.CENTER );
list.addListSelectionListener(this);
button.addActionListener(this);
jtf.addKeyListener(this);
}
public static void main(String[] args)
{
try
{
addDictionary();
} catch (IOException e)
{
e.printStackTrace();
}
spellChecker checkerFrame=new spellChecker();
checkerFrame.pack();
checkerFrame.setTitle("SPELL CHECKER");
checkerFrame.setSize(600,500);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
Dimension frameSize=checkerFrame.getSize();
int x=(screenWidth-frameSize.width)/2;
int y=(screenHeight-frameSize.height)/2;
checkerFrame.setLocation(x,y);
checkerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
checkerFrame.setVisible(true);
}
public void keyPressed(KeyEvent e)
{
// TODO Auto-generated method stub
}
public void keyReleased(KeyEvent e)
{
// TODO Auto-generated method stub
int key=e.getKeyCode();
//System.out.println("KeyTyped :"+ key);
if(key==KeyEvent.VK_ENTER) //輸入完后按回車查詢單詞
{
String str=jtf.getText().trim();
if(str.length()>0)
{
int index=search(str);
jta.setText("");
if(index==-1)
{
jta.append("單詞拼寫錯誤\n");
matchWordIndex.removeAllElements();
giveWords(str); //查找可能的與輸入相近的單詞
if(matchWordIndex.size()>0)
{
jta.append("拼寫校正 你要輸入的單詞是不是:\n");
for (int i=0;i<matchWordIndex.size();i++)
{
Integer integerObject=(Integer)(matchWordIndex.elementAt(i));
int matchIndex=integerObject.intValue();
jta.append(wordVector.elementAt(matchIndex)+" "+getExplanation(matchIndex)+"\n");
}
}
else
jta.append("找不到與你輸入相近的單詞\n");
}
else
{
String explanation=new String(getExplanation(index));
jta.append(explanation+"\n");
}
//jtf.setText("");
}
}
if(key==KeyEvent.VK_DELETE) //按DELETE鍵
{
String str=jtf.getText().trim();
if(str.length()>0)
{
int index=perSearch(str);
System.out.println(index);
list.setSelectedIndex(index);
scrollPane1.getVerticalScrollBar().setValue(index*20);
}
}
else if(key==KeyEvent.VK_DOWN) //按down鍵
{
int index=list.getSelectedIndex();
index++;
list.setSelectedIndex(index);
scrollPane1.getVerticalScrollBar().setValue(index*20);
jtf.setText((String) wordVector.elementAt(index));
}
else if(key==KeyEvent.VK_UP) //按up鍵
{
int index=list.getSelectedIndex();
index--;
list.setSelectedIndex(index);
scrollPane1.getVerticalScrollBar().setValue(index*20);
jtf.setText((String) wordVector.elementAt(index));
}
else
{
String str=jtf.getText().trim();
if(str.length()>0)
{
int index=perSearch(str);
System.out.println(index);
list.setSelectedIndex(index);
scrollPane1.getVerticalScrollBar().setValue(index*20);
}
}
}
public void keyTyped(KeyEvent e)
{
// TODO Auto-generated method stub
}
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
if(e.getSource()==button) //輸入完后按查詢按鈕查詢單詞
{
String str=jtf.getText().trim();
if(str.length()>0)
{
int index=search(str);
jta.setText("");
if(index==-1)
{
jta.append("單詞拼寫錯誤\n");
giveWords(str);
if(matchWordIndex.size()>0)
{
jta.append("拼寫校正 你要輸入的單詞是不是:\n");
for (int i=0;i<matchWordIndex.size();i++)
{
Integer integerObject=(Integer)(matchWordIndex.elementAt(i));
int matchIndex=integerObject.intValue();
jta.append(wordVector.elementAt(matchIndex)+" "+getExplanation(matchIndex)+"\n");
}
}
else
jta.append("找不到與你輸入相近的單詞\n");
}
else
{
String explanation=new String(getExplanation(index));
jta.append(explanation+"\n");
}
//jtf.setText("");
}
}
}
public void valueChanged(ListSelectionEvent arg0)
{
// TODO Auto-generated method stub
int index=list.getSelectedIndex();
System.out.println(index);
//jtf.setText((String) wordVector.elementAt(index));
String explanation=new String(getExplanation(index));
jta.setText("");
jta.append(explanation+"\n");
}
public static void addDictionary() throws IOException
{
// TODO 將英文字典讀入,同時建立一級索引
BufferedReader wordFile=null;
String inLine;
try
{
wordFile=new BufferedReader(new FileReader("wordList.txt"));
searchIndex[0]=0; //a的起始位置
int index=1;
while((inLine=wordFile.readLine())!=null)
{
wordVector.add(inLine); //將讀入的單詞存放在向量中
char ch=inLine.charAt(0);
if(ch<'Z'&&ch >'A') //如果首字母是大寫,將其轉換為小寫,便于處理
ch=(char)((int)ch-'A'+'a');
if((int)ch-97-index==0) //同時建立一級索引
{
searchIndex[index]=wordVector.size()-1;
index++;
}
}
list=new JList(wordVector);
searchIndex[26]=wordVector.size()-1;
}
catch(FileNotFoundException ex)
{
System.out.println("File not found :");
}
finally
{
try
{
if(wordFile!=null)
wordFile.close();
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
}
public static String getExplanation(int index)
{
//TODO 顯示英文單詞所對應的中文解釋
BufferedReader explanationFile = null;
String explanation="";
try
{
explanationFile=new BufferedReader(new FileReader("explanationList.txt"));
for(int i=0;i<=index;i++)
explanation=explanationFile.readLine();
}
catch(IOException ex)
{
System.out.println("Error:"+ex);
}
finally
{
try
{
if(explanationFile!=null)
explanationFile.close();
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
int i=0;
while(explanation.charAt(i)!='$')
i++;
explanation=explanation.substring(i+1);
return explanation;
}
public int search (String str)
{
//TODO 查找,采用一級索引加二分查找法,若找到,返回該單詞所在向量的位置;找不到,返回-1
char ch=str.charAt(0);
if(ch<'Z'&&ch >'A')
ch=(char)((int)ch-'A'+'a');
int head=searchIndex[(int)ch-97];
int tail=searchIndex[(int)ch-96];
return binarySearch(str, wordVector, head, tail-1);
}
public int binarySearch(String str,Vector vector,int head ,int tail)
{
//TODO 遞歸二分查找法
if((tail-head)==1)
{
if(((String)wordVector.elementAt(head)).equals(str))
return head;
else if(((String)wordVector.elementAt(tail)).equals(str))
return tail;
else
return -1;
}
else
{
int mid=(head+tail)/2;
int result=((String)wordVector.elementAt(mid)).compareToIgnoreCase(str);
if(result<0)
return binarySearch(str,wordVector,mid,tail);
else if(result>0)
return binarySearch(str,wordVector,head,mid);
else
return mid;
}
}
public int perSearch(String str)
{
//TODO 聯想搜索
char ch=str.charAt(0);
if(ch<'Z'&&ch >'A')
ch=(char)((int)ch-'A'+'a');
int head=searchIndex[(int)ch-97];
int tail=searchIndex[(int)ch-96];
return binaryPerSearch(str, wordVector, head, tail-1);
}
public int binaryPerSearch(String str,Vector vector,int head ,int tail)
{
//TODO 聯想二分查找
if((tail-head)==1)
{
if(((String)wordVector.elementAt(head)).equals(str))
return head;
else if(((String)wordVector.elementAt(tail)).equals(str))
return tail;
else
{
int result=((String)wordVector.elementAt(head)).compareToIgnoreCase(str);
if(result<0)
return tail;
else
return head;
}
}
else
{
int mid=(head+tail)/2;
int result=((String)wordVector.elementAt(mid)).compareToIgnoreCase(str);
if(result<0)
return binaryPerSearch(str,wordVector,mid,tail);
else if(result>0)
return binaryPerSearch(str,wordVector,head,mid);
else
return mid;
}
}
public void giveWords(String str)
{
//TODO 給出參考的單詞序列
insertLetter(str);
deleteLetter(str);
changeLetter(str);
swapLetter(str);
}
public void insertLetter(String str)
{
//TODO 在給定的字符串中插入一個字母,看能不能找到正確的單詞
char[] tempStr=str.toCharArray();
for (int i=1;i<str.length()+1;i++)
{
for (int ch=(int)'a';ch<=(int)'z';ch++)
{
String newStr=new String (insertChar(tempStr,i,(char)ch)); //在字符串的第i個位置插入字母ch
int index=search(newStr);
if(index!=-1)
if(matchWordIndex.indexOf(new Integer(index))==-1)
matchWordIndex.addElement(new Integer(index));
}
}
}
public void deleteLetter(String str)
{
//TODO 刪除給定的字符串中的一個字母,看能不能找到正確的單詞
char[] tempStr=str.toCharArray();
for (int i=1;i<str.length();i++)
{
String newStr=new String (deleteChar(tempStr,i)); //刪除第i個字母
int index=search(newStr);
if(index!=-1)
if(matchWordIndex.indexOf(new Integer(index))==-1)
matchWordIndex.addElement(new Integer(index));
}
}
public void changeLetter(String str)
{
//TODO 替換給定字符串中的一個字母,看能不能找到正確的單詞
char[] tempStr=str.toCharArray();
for (int i=1;i<str.length();i++)
{
for (int ch=(int)'a';ch<=(int)'z';ch++)
{
String newStr=new String (changeChar(tempStr,i,(char)ch)); //將字符串的第i個位置替換為字母ch
int index=search(newStr);
if(index!=-1)
if(matchWordIndex.indexOf(new Integer(index))==-1)
matchWordIndex.addElement(new Integer(index));
}
}
}
public void swapLetter(String str)
{
//TODO 交換單詞中的字母,看能不能找到正確的單詞
char[] tempStr=str.toCharArray();
for (int i=1;i<str.length()-1;i++) //交換相鄰的兩個字母
{
String newStr=new String (swapNeighbour(tempStr,i)); //交換字符串的第i個位置與第i+1個位置的字母
int index=search(newStr);
if(index!=-1)
if(matchWordIndex.indexOf(new Integer(index))==-1)
matchWordIndex.addElement(new Integer(index));
}
for(int i=0;i<str.length()-2;i++) //交換相隔的兩個字母
{
String newStr=new String (swapApart(tempStr,i)); //交換字符串的第i個位置與第i+2個位置的字母
int index=search(newStr);
if(index!=-1)
if(matchWordIndex.indexOf(new Integer(index))==-1)
matchWordIndex.addElement(new Integer(index));
}
}
public char[] insertChar(char[] charStr,int location,char ch)
{
//TODO 將給定字符插入給定字符串的給定位置
char[] temp=new char[charStr.length+1];
for(int i=0;i<charStr.length+1;i++)
{
if(i<location)
temp[i]=charStr[i];
else if(i==location)
temp[i]=ch;
else
temp[i]=charStr[i-1];
}
return temp;
}
public char[] deleteChar(char[] charStr,int location)
{
//TODO 將給定位置的字符刪除
char[] temp=new char[charStr.length-1];
for(int i=0;i<charStr.length-1;i++)
{
if(i<location)
temp[i]=charStr[i];
else
temp[i]=charStr[i+1];
}
return temp;
}
public char[] changeChar(char[] charStr,int location,char ch)
{
//TODO 將給定位置的字符替換為給定字符
char[] temp=new char[charStr.length];
for(int i=0;i<charStr.length;i++)
{
if(i==location)
temp[i]=ch;
else
temp[i]=charStr[i];
}
return temp;
}
public char[] swapNeighbour(char[]charStr,int location)
{
//TODO 將給定位置的字母與其后一個字母互換
char[] temp=new char[charStr.length];
for(int i=0;i<charStr.length;i++)
{
if(i==location)
temp[i]=charStr[i+1];
else if(i==location+1)
temp[i]=charStr[i-1];
else
temp[i]=charStr[i];
}
return temp;
}
public char[] swapApart(char[]charStr,int location)
{
//TODO 將給定位置的字母與其后第二個字母互換
char[] temp=new char[charStr.length];
for(int i=0;i<charStr.length;i++)
{
if(i==location)
temp[i]=charStr[i+2];
else if(i==location+2)
temp[i]=charStr[i-2];
else
temp[i]=charStr[i];
}
return temp;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -