import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class StringMatch extends JFrame {
TextField tf1;//文本框1,大字符串
TextField tf2;//文本框2,指定匹配的字符串
TextField tf3;//文本框3,输入从第几个字符开始匹配
JButton jb;//按钮
JLabel lab1,lab2,lab3,lab4,lab5;//标签
JPanel panel1,panel2,panel3;//面板
String str,s;//大字符串,指定需要匹配的字符串
int pos;//开始匹配的起始位置
StringMatch(){
//初始化组件
tf1=new TextField(10);
tf2=new TextField(5);
tf3=new TextField(3);
lab1=new JLabel("请输入一串英文字符(不超过10个字符)");
lab2=new JLabel("请输入一串英文字符(不超过5个字符)");
//返回匹配结果
lab3=new JLabel("单击按钮,输出是否匹配以及匹配的字符串下标");
lab5=new JLabel("输入开始匹配的起始位置");
//按钮
jb=new JButton();
jb.setPreferredSize(new Dimension(100, 25));
// seticon(jb);
jb.setText("确定");
lab4=new JLabel("结果是:");
FlowLayout fl=new FlowLayout(FlowLayout.LEFT,10,10);
GridLayout gr=new GridLayout(3,1);
//面板1
panel1=new JPanel();
panel1.add(lab1);
panel1.add(tf1);
panel1.setLayout(gr);
add(panel1);//水平间距,垂直间距
//面板2
panel2=new JPanel();
panel2.add(lab2);
panel2.add(tf2);
panel2.add(lab5);
panel2.add(tf3);
panel2.setLayout(gr);
add(panel2);
//面板3
panel3=new JPanel();
panel3.add(lab3);
panel3.add(jb);
panel3.add(lab4);
panel3.setLayout(fl);
add(panel3);
//监听按钮事件
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(tf1.getText().length()==0 || tf2.getText().length()==0 || tf3.getText().length()==0)
JOptionPane.showMessageDialog(null,"需输入字符!","警告",JOptionPane.WARNING_MESSAGE);
else
Match(e);
}
});
}
//给按钮设置合适的图片
public void seticon(JButton jb){
ImageIcon ic=new ImageIcon("D:\\eclipse-java-neon-3-win32-x86_64\\eclipse\\workspace\\Java-exercise\\src\\q-4.jpg");
Image temp=ic.getImage().getScaledInstance(80,50,ic.getImage().SCALE_DEFAULT);
ic=new ImageIcon(temp);
jb.setIcon(ic);
}
public void Match(ActionEvent e){
str=tf1.getText();
s=tf2.getText();
pos=Integer.parseInt(tf3.getText());
if(e.getActionCommand().equals("确定")){
//返回匹配结果
lab4.setText("结果是:"+String.valueOf(Index_KMP(str,s,pos)));
}
}
//匹配算法
public int Index_KMP(String S,String T,int pos){
int lenS=S.length();
int lenT=T.length();
int i=pos;
int j=0;
int[] next=new int[255];
//字符串转换成字符数组
char[] Str=S.toCharArray();
char[] Ttr=T.toCharArray();
next=get_nextval(T,next);
//循环
while(i<lenS && j<lenT){
if((j==-1) || Str[i]==Ttr[j]){
++i;
++j;
}else
{
j=next[j];
}
}
if(j==lenT)
return i-lenT;
else
return -1;
}
//匹配算法的next数组改进
public int[] get_nextval(String T,int[] nextval){
int i,j;
int lenT=T.length();
char[] Ttr=T.toCharArray();
i=0;
j=-1;
nextval[0]=-1;
while(i<lenT-1){
if(j==-1 || Ttr[i]==Ttr[j] ){
++i;
++j;
if(Ttr[i]!=Ttr[j])nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
return nextval;
}
public static void main(String[] args){
StringMatch sm=new StringMatch();
sm.setBounds(300,300,400,250);
sm.setResizable(false);
sm.setVisible(true);
sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout grid=new GridLayout(3,3);
sm.setLayout(grid);
}
}
运行结果: