📄 dictionaryframe.java
字号:
{
System.err.println(ex);
}
}
}
public void ListChanged()
{
try
{
ChangedText = true;//防止Text框联动变换
int index = lst.getSelectedIndex();//得到取得的偏移
InputBox.setText(Word[index]);
OutputBox.setText(getMeaning(off[index],len[index]));//设置输入框和输出框
getFirst(Word[index]);
RecentPoint = index;//设置好NextPoint与RecentPoint
NowPoint =index;
}
catch(Exception ex)
{
System.err.println(ex);
}
}
public String getMeaning(int off,int len) throws Exception
{
//////////////////////////////////////////////////////
////这一段是根据偏移及长度读取解释
File f1 = new File ("stardict.dict");
RandomAccessFile raf=new RandomAccessFile(f1,"r");
byte []buffer = new byte [len];
raf.seek(off);
for(int i = 0;i<len;i++)
{
buffer[i] = raf.readByte();
if(buffer[i] == 0) buffer[i] =' ';//防止得到'\0'使输出中断
}
//raf.readFully(buffer,0,len);
String s = new String(buffer,"UTF-8");//以UTF-8格式读入字符串
raf.close();
return s;
}
public void InIdx() throws Exception
{
////////////////////////////////////////////////////
////读入索引
File f2 = new File ("stardict.idx");
FileInputStream fidx=new FileInputStream(f2);
byte attempt[] = new byte [200];//临时数组
int i;
for(int j = 0;j<WORDCOUNT;j++)
{
i = -1;
do
{
i++;
attempt[i] = (byte)fidx.read();
}while(attempt[i] != 0 );
////以下得到单词及其偏移,长度
Word[j] = new String(attempt,0,i);
off[j] = fidx.read()*1677216+fidx.read()*65536+fidx.read()*256+fidx.read();
len[j] = fidx.read()*1677216+fidx.read()*65536+fidx.read()*256+fidx.read();
}
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// Exit application.
System.exit(0);
}
public int getFirst(String w) throws Exception
{
/////////////////////////////////////////////////////////
////得到第一个字母的初期值,可以有效减少查找量
File f4 = new File ("idxidx.idx");
FileInputStream idxidx=new FileInputStream (f4);
//System.out.print((int)w.charAt(0));
int First = w.charAt(0);//得到第一个字母
if(First <97 ) First+=32;
if(First <97 ||First >122)
{
NextPoint = 0;
FirstPoint = 0;
return 0;
}
idxidx.skip((First-97)*8+6);
FirstPoint = idxidx.read()*256+idxidx.read();//得到FirstPoint
idxidx.skip(6);
NextPoint = idxidx.read()*256+idxidx.read();//得到NextPoint
idxidx.close();
//System.out.print(re);
return FirstPoint;
}
public boolean getWord(String s) throws Exception
{
/////////////////////////////////////////////////////
////关于查找单词,我采用步进法,先按l长度向前查找,在找到
////大于此单词的单词之后,后退l;步长设为1,再搜索,即可找到
////与其最相近的单词;
////
int lenth = s.length();
if (lenth == 0) return false;
s = s.toLowerCase();
byte []s1 = s.getBytes();//将s转为字节组
byte attempt[];
int i;
int loop;
int l = 40;//设置步长
//boolean first = true;
for(int time =0;time<2;time++)
{
for(;RecentPoint<NextPoint;RecentPoint+=l)//至多比到NextPoint
{
Word[RecentPoint] = Word[RecentPoint].toLowerCase();
attempt = Word[RecentPoint].getBytes();//将词库中得到的单词字节组化
if(lenth <=Word[RecentPoint].length()) loop = lenth;
else loop = Word[RecentPoint].length();//循环比较次数为字节较少者;
{
for(i = 1;i<loop;i++)
{
if(attempt[i] < s1[i])
{
break;//若小于,跳出
}
if(attempt[i] > s1[i])
{
//大于分两种情况
if((l == 1)) return false;//步长为1时选择完毕;
RecentPoint -=l;//否则,将步长调整为1,从做
if(RecentPoint < FirstPoint) RecentPoint =FirstPoint;
l = 1;
break ;
}
}
if(i ==lenth&&lenth <Word[RecentPoint].length()) //若前Loop个字母全相等,且待查字母长度短
{
//依步长分两种情况,同上
if((l == 1)) return false;
RecentPoint -=l;
if(RecentPoint < FirstPoint) RecentPoint =FirstPoint;
l = 1;
}
if(i ==lenth&&lenth ==Word[RecentPoint].length()) return true;
//匹配完成,返回
}
//first = false;
}
RecentPoint-=l;
if(RecentPoint < FirstPoint) RecentPoint =FirstPoint;
l = 1;
}
return false;
}
public String getAlike(String s) throws Exception
{
/////////////////////////////////////////////////////
////这一段是用于纠错的.
////首先我们确信,第一位字母是不会写错的,可以省下部分计算量
////然后分不同情况将字母排列变换,检查其是否存在.
int t1= RecentPoint;
int t2 = NowPoint;
int t3 = NextPoint;//存入现在指针位置;
int t4 = FirstPoint;
NowPoint = -1;
int lenth = s.length();
s = s.toLowerCase();
byte []s1 = s.getBytes();
byte temp;
boolean Exist = false;
byte []s2 = new byte[lenth-1];
byte []s3 = new byte[lenth+1];
String Like = new String("发生相邻字母位置颠倒问题的单词有:\n");
for(int i=1;i<lenth-1;i++)//交换相邻字母位置,查找
{
temp = s1[i];
s1[i] = s1[i+1];
s1[i+1] = temp;
if(isExist(new String(s1)))
{
Like = Like +new String(s1)+"\n";
Exist = true;
}
s1 = s.getBytes();
}
if(!Exist) Like = Like +"none\n";
Exist = false;
Like = Like +"\n发生某一位字母写错问题的单词有:\n";
for(int i=1;i<lenth;i++)//将单词中字母依次变换,查找
{
for(int j=97;j<123;j++)
{
s1[i] =(byte) j ;
if(isExist(new String(s1)))
{
Like = Like +new String(s1)+"\n";
Exist = true;
}
s1 = s.getBytes();
}
}
if(!Exist) Like = Like +"none\n";
Exist = false;
Like = Like +"\n发生多某一位字母的问题的单词有:\n";
for(int i=1;i<lenth;i++)//将单词中字母去掉一个,查找
{
for(int j = 0;j<lenth-1;j++)
{
if(j>=i) s2[j] = s1[j+1];
else s2[j] = s1[j];
}
if(isExist(new String(s2)))
{
Like = Like +new String(s2)+"\n";
Exist = true;
}
}
if(!Exist) Like = Like +"none\n";
Exist = false;
Like = Like +"\n发生少写某一位字母问题的单词有:\n";
for(int i=1;i<=lenth;i++)//在单词中添加字母,查找
{
for(int j=97;j<123;j++)
{
for(int k = 0;k<lenth+1;k++)
{
if(k ==i)
{
s3[k] =(byte) j ;
}
else
if (k> i) s3[k] = s1[k-1];
else s3[k] = s1[k];
}
if(isExist(new String(s3)))
{
Like = Like +new String(s3)+"\n";
Exist = true;
}
}
}
if(!Exist) Like = Like +"none\n";
Exist = false;
RecentPoint =t1;
NowPoint =t2;
NextPoint = t3;//恢复指针
FirstPoint = t4;
return Like;
}
public boolean isExist(String s) throws Exception
{
////////////////////////////////////////////
////查找单词是否存在
RecentPoint = getFirst(s);
if(getWord(s))
return true;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -