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

📄 boyer-moore.java

📁 用 boyer-moore 算法实现 字符串的 查找 程序特点: 图形化的界面
💻 JAVA
字号:
/*本程序实现用  boyer-moore  算法实现  字符串的 查找
 *程序特点:  图形化的界面   ,并把查找到的结果  高亮显示
 *
 *
 *
 **/
import java.io.*;
import java.lang.*;
import java.util.*;
import java.awt.*;
import java.awt.Dialog.*;
import java.awt.event.*;
import javax.swing.*;

import javax.swing.event.*;

import javax.swing.text.*;


class MainFrame extends JFrame 
    {
        //String s=null;
        String lowStringText = null;
        String lowStringMoshi = null;        
        char []ch1 = new char[1];

                String string,string2;

                int T,t,k;
                int m,n,o=0;


        FileOpen fileOpen;

        JPanel jPanel1;
         JPanel jPanelScroll;
           JPanel jPanelScrol2;

	public	JCheckBox jCheckBox ;
		JLabel  jLabel ;
		
		JRadioButton jRadioButtonBigCase,jRadioButtonIgnorCase ;
       public  JTextArea jTextArea_moshi,jTextArea1,jTextArea2;
 
//               public JTextField jTextArea_moshi;
               
               
        JButton jButtonOpenFile ,
        		jButtonTongji,

                jButtonExit ;

                JScrollPane jScrollPane1;
                 JScrollPane jScrollPane2;
			
		public static	boolean ingnorCase = true ;

        MainFrame()
        {
 		
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setDefaultLookAndFeelDecorated(false);
            this.fileOpen = fileOpen;
            jTextArea1 = new JTextArea(21,25);
            jTextArea1.setEditable(true);
            jTextArea1.setBackground(new Color(220,220,180));
            jTextArea1.setFont(new Font("Dialog",0,18));

			jTextArea_moshi = new JTextArea(10,15);
			jTextArea_moshi.setBackground(new Color(220,220,180));
			jTextArea_moshi.setFont(new Font("Dialog",0,18));
			jTextArea_moshi.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("请在此输入你想要查找的字符串"),BorderFactory.createEmptyBorder(0,0,0,0)));

           jTextArea2 = new JTextArea(21,30);
           jTextArea2.setBackground(new Color(220,220,180));
                jTextArea2.setFont(new Font("Dialog",0,18));
		

            jButtonOpenFile = new JButton("文件导入");
            jButtonOpenFile.setFont(new Font("Dialog",0,20));

           
			jButtonTongji= new JButton("模式匹配");
            jButtonTongji.setFont(new Font("Dialog",0,20));
            			
            jButtonExit= new JButton("退出系统");
            jButtonExit.setFont(new Font("Dialog",0,20));

            jScrollPane1 = new JScrollPane();
            jScrollPane1.getViewport().add(jTextArea1);
			jScrollPane1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("文件导入或键盘输入"),BorderFactory.createEmptyBorder(0,0,0,0)));

            jScrollPane2 = new JScrollPane();
            jScrollPane2.getViewport().add(jTextArea2);
			jScrollPane2.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("匹配结果输出"),BorderFactory.createEmptyBorder(0,0,0,0)));



		jRadioButtonBigCase = new JRadioButton("区分大小写");
		jRadioButtonIgnorCase = new JRadioButton("区分大小写");

			jCheckBox = new JCheckBox("区分大小写",false);
			jCheckBox.addItemListener(new ItemListener()
			{
				public void itemStateChanged(ItemEvent ex) 
				{  JCheckBox temp =null;
					if(ex.getItemSelectable() instanceof JCheckBox)
					{
						temp = (JCheckBox)ex.getItemSelectable();
						if( temp.isSelected())
						{
							ingnorCase = false ;
						}
						else
						{
							
							ingnorCase = true ;							
							
						}
						
							
					}
					
				}
				});


			jLabel = new JLabel("区分大小写");
			
            jPanel1 = new JPanel();       

             jPanel1.setLayout(null);
            jPanel1.setSize(100,200);


			jTextArea_moshi.setBounds(3,20,235,250);
			jButtonOpenFile.setBounds(50,310,160,30);
			jButtonTongji.setBounds(50,380,160,30);
			jButtonExit.setBounds(50,450,160,30);
			jLabel.setBounds(100,280,80,20);
			jCheckBox.setBounds(80,280,180,20);
			jRadioButtonIgnorCase.setBounds(10,280,100,20);			
			jRadioButtonBigCase.setBounds(150,280,100,20);
            jPanel1.add(jTextArea_moshi);
             jPanel1.add(jCheckBox);	
        			
            jPanel1.add(jButtonOpenFile);
           jPanel1.add(jTextArea_moshi);           
            jPanel1.add(jButtonTongji);           
            jPanel1.add(jButtonExit);

            jPanelScroll = new JPanel();

            jButtonOpenFile.addActionListener(new FileOpen(this));


			jButtonTongji.addActionListener(new FileOpen(this));

            jButtonExit.addActionListener(new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {

                            System.exit(0);
                        }
                    } );

           Container container = this.getContentPane();
          container.setBackground(new Color(200,200,20));

     	  container.setLayout(null);
           this.setSize(800,600);
           this.setResizable(false);
           
           jScrollPane1.setBounds(0,0,550,567);
          container.add(jScrollPane1);

          jPanel1.setBounds(550,0,250,567);
         container.add(jPanel1);
         

        
          container.add(jScrollPane2);

            
        }

    
  class FileOpen implements ActionListener
            {
            	
           	MyHighlightPainter myHighlightPainter = new MyHighlightPainter(Color.PINK);	
             	 Highlighter h ; 
       		// h.removeAllHighlights();	
            	
            	String moshi ,textString ;
                MainFrame mainFrame;
                char ch1,ch2,ch;
                char []arrayChar = new char[20000];
				int []dist ;
                 FileReader fileRead ;
			String text ;
                FileOpen(MainFrame mainFrame)
                {
                    this.mainFrame = mainFrame;

                }
                public void actionPerformed(ActionEvent e)
                {
                 if (e.getActionCommand()=="文件导入")
                 {
                     try
                  {
                      FileDialog  fileDialog = new FileDialog(mainFrame,"文件导入",0);
                     fileDialog.setDirectory("D:\\");
                      fileDialog.show();
                      File file = new File(fileDialog.getDirectory(),fileDialog.getFile());
                      fileRead = new FileReader(file);
                     int length =  fileRead.read(arrayChar);
                      string = new String(arrayChar,0,length);

                   mainFrame.jTextArea1.setText(string);

                   System.out.println(string);

                  }catch(Exception ex)
                  {
                      ex.printStackTrace();
                 }
                 }//endif
        else
        {

        	
        	
        	String  moshi =null ;
        	String s = null;
        	
          string = mainFrame.jTextArea1.getText();
          mainFrame.jTextArea2.setText("");
          if(ingnorCase==false)
          {
			s =  string;
			moshi = mainFrame.jTextArea_moshi.getText();
          }
          else
          {
        	 lowStringText = string.toLowerCase();  
       		 s = lowStringText ;    
       		 
       		 lowStringMoshi = mainFrame.jTextArea_moshi.getText().toLowerCase();         	
          	  moshi = lowStringMoshi;
          }

        
         	 text = s ;
	
	    	System.out.println(moshi);

			init(moshi);   //初始化	

				
				biPei(dist,text,moshi);
                      }//endelse
                 }
                       
         
	public   void init(String moshi)
	{
	
		int length = moshi.length();
		dist = new int[128*128*128];
		char lastChar = moshi.charAt(length-1);
		
		for(int i=0;i<=length-1;i++)
		{
			char charTemp = moshi.charAt(i);
			dist[charTemp] =length-moshi.lastIndexOf(charTemp)-1;
		//	int a =moshi.lastIndexOf(charTemp)-1;
			
		}
		if(moshi.indexOf(lastChar)==moshi.lastIndexOf(lastChar))
		{
			dist[lastChar] = length;
		}
		else
		{

			String subString = moshi.substring(0,length-1);
			dist[lastChar] = subString.lastIndexOf(lastChar)+1;
		
		}
	}   
    
       
	public  void  biPei(int []dist,String text,String moshi)
	
	{
		
        Highlighter h = mainFrame.jTextArea1.getHighlighter();
        h.removeAllHighlights();

		int start =0 ;
		int end =  0;
		
		int n = text.length()-1;
		int m = moshi.length()-1;
		char t,q,p=0;
		int k,j,i=m;
		char pos = 0 ;
		int count = 0;
 	 while(i<=n)
	   {	j=m;
	    	 k=i;   
	        	 
	   	while(j>=0)
	      { 	
	      	 t = (char)text.charAt(k);	    	 
	    	 p = (char)moshi.charAt(j);
	    	 pos = t ;
	    	 System.out.println("moshi :"+p+"-----"+t+"  (text )");
	        	if(p==t)
	        	{
		    	 j=j-1;
	        	 k=k-1;       		
	        	}
	        	else
	        	{
	        		for(q=0;q<m;q++)
	        		{
	        			if(pos==moshi.charAt(q))
	        			{
	        				break ;
	        			}

	        		}
	        		if(q>=m)
	        		{
	        			i = i+m;
	        		}
			       else
			       {
			       	 	       i = i+dist[pos];
			       }
	        		break ;
	        	}	 
	        	  
	       }
	       if(j<0)
	       {
	              int temp = i-m+1 ;
	              System.out.println("matched begins in position"+temp);
				 mainFrame.jTextArea2.append("matched begins in position : "+temp+'\n');
				try
				{
					h.addHighlight(temp-1,temp+m,myHighlightPainter);					
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}

				count++;
			if(count==1)
			{
				start =temp-1;
				end = temp+m ;
			}
	       	 i++ ;
	       }

	    }
	    
	    if(count>0)
	    {
		mainFrame.jTextArea1.select(start,end) ;
	 	mainFrame.jTextArea1.setSelectedTextColor(Color.red); 	    	
	    }
	      
	    else
	    {
	    	JOptionPane.showMessageDialog(null,"对不起!没有你要查找的字符串!");
	    }
	 mainFrame.jTextArea2.append("the total of string  \"" +moshi+"\"  :  " +count+"   places");
	    		
	}	

            }

       }
   
// 加入自己喜欢的高亮颜色
    class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {
        public MyHighlightPainter(Color color) {
            super(color);
        }
    }     
     
       
     class Letter_Tongji
      {
            public static void main(String args[])
            {
                    MainFrame mainFrame = new MainFrame();
                    mainFrame.show();
            }
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -