⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dictionaryframe.java

📁 利用开源词典star-dict编写的一个小词典程序,使用方法仿照金山词霸
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			 {
				 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 + -