用JAVA 实现图像化的模式串匹配并于文本区显示颜色

首先是KMP算法,下面是代码,关于这个算法这个网址写的是我见过的最清楚基础明白的,适合初学:http://blog.csdn.net/arronxu1989/article/details/12857507 (CSDN)

KMP_method.java

public class KMP_method {
	public int[] getNext(char[] s)
	{
		int length=s.length;
		int[] next=new int[length+1];
		char[] tempChar=s;
		for(int i=1;i<length;i++)
			for(int j=0;i<i;j++)
				for(int k=0;k<=j;k++)
				{
					if(tempChar[k]!=tempChar[i-j+k])
						break;
					if((k==j)&&k>=next[i])
						next[i]=k+1;
				}
		return next;
	}
	
	public int find(char[] src,char[] ch)
	{
		if(src==null||ch==null)
			return -1;
		int len1=src.length;
		int len2=ch.length;
		int[] next=getNext(ch);
		System.out.println("src len is:"+len1+'\n'+"pattern len is:"+len2);
		int i,j;
		for(i=0;i<len1-len2;){
			for(j=0;j<len2;++j)
			{
				if(src[i+j]!=ch[j])
				{
					if(src[i+j]==' ')
					{
						i+=j>0?j:1;
						System.out.println("i is:"+i);
						break;
					}
					else 
					{
						i+=(j-ch[j])>1 ? (j-ch[j-1]):1;
						System.out.println("i is:"+i);
	                	break;
					}
				}
				if(j==len2-1)
				{
					return i;
				}
			}
		}
		return -1;
	}
	
}

接下来是读取文件 txt2string.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class txt2string {
	
	public String fun(File file)
	{
		StringBuilder result=new StringBuilder();
		try{
			BufferedReader br=new BufferedReader(new FileReader(file));
			String s=null;
			while((s=br.readLine())!=null){
				result.append(s);
			}
			br.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return result.toString();
	}

}



再则是布局文件和相应事件

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;


public class SimpleFrame extends JFrame{

	private final int DEFAUFLT_WIDTH=300;
	private final int DEFAULT_HEIGHT=200;
		
	public SimpleFrame()
	{
//		setSize(DEFAUFLT_WIDTH,DEFAULT_HEIGHT);
		
		final JTextField textField=new JTextField();
		
		JPanel northPanel=new JPanel();
		northPanel.setLayout(new GridLayout(2,2));
		northPanel.add(new JLabel("请输入模式串:",SwingConstants.LEFT));
		northPanel.add(textField);
		add(northPanel,BorderLayout.NORTH);
		
		final JTextPane textPane=new JTextPane();
		textPane.setPreferredSize(new Dimension(DEFAUFLT_WIDTH,DEFAULT_HEIGHT));
		JScrollPane scrollPane=new JScrollPane(textPane);
		add(scrollPane,BorderLayout.SOUTH);
		
		JPanel centerPanel=new JPanel();
		centerPanel.setLayout(new GridLayout(1,2));
		JPanel centerPanel_left=new JPanel();
		
		JButton loadButton=new JButton("LOAD");
		centerPanel_left.add(loadButton);
		loadButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				txt2string txt=new txt2string();
				File file=new File("rec.txt");

				//设置字体大小
		        SimpleAttributeSet attrset = new SimpleAttributeSet();
		        StyleConstants.setFontSize(attrset,15);
				Document docs = textPane.getDocument();//获得文本对象
				try {
		            docs.insertString(docs.getLength(),txt.fun(file), attrset);//对文本进行追加
		        } catch (BadLocationException e) {
		            e.printStackTrace();
		        }
				
			}
		});
		centerPanel.add(centerPanel_left);
		JPanel centerPanel_right=new JPanel();
		JButton findButton=new JButton("FIND");
	    findButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
			    KMP_method kmp_method=new KMP_method();
			    String src1=textPane.getText();
			    char[] src=src1.toCharArray();
			    String ch1=textField.getText();
			    char[] ch=ch1.toCharArray();
				int temp=kmp_method.find(src, ch);
				int findId=9999;
			    if(temp!=-1)
			    findId=temp;
			    System.out.println(findId);
			    StyledDocument document = textPane.getStyledDocument();
				MutableAttributeSet attributes = new SimpleAttributeSet();
				StyleConstants.setForeground(attributes, Color.blue);
				document.setCharacterAttributes(findId, ch.length, attributes, false);
			    
			}
		});
		centerPanel_right.add(findButton);
		centerPanel.add(centerPanel_right);
		add(centerPanel,BorderLayout.CENTER);	
		
		pack();
	}
}

最后是客户端程序Client.java

import java.awt.EventQueue;

import javax.swing.JFrame;

public class Client {
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				SimpleFrame frame=new SimpleFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

效果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值