📄 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 + -