import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 文本坐标记用的
* tagBegin是开始标记
* tagEnd 是结束标记
* 用了二分法查找来确定单词
* content 是传入的正文
* 正文可以传多次
* 标记词语也可以传多次
* @author Ansj
*
*/
public class TagWord {
private String tagBegin;
private String tagEnd;
Branch frontbegin = null;
Set<String> keyWords = new HashSet<String>();
public TagWord(String begin, String end) {
this.tagBegin = begin;
this.tagEnd = end;
}
public TagWord addKeyWords(String[] keyWord) {
if (keyWord.length > 0) {
for (int i = 0; i < keyWord.length; i++) {
this.keyWords.add(keyWord[i].trim());
}
}
return this;
}
// 是否发现词
boolean findWord = false;
public String getTagContent(String content) {
if (content == null || content.trim().length() == 0
|| keyWords.size() == 0) {
return content;
}
this.frontbegin = new MakeLibrary().getStringTree(this.keyWords);
if(frontbegin==null){
return content ;
}
char[] chars = content.toCharArray();
// 正文
StringBuilder sb = new StringBuilder();
WoodInterface head = this.frontbegin;
int start = 0;
int end = 1;
int index = 0;
boolean isBack = false ;
int length = chars.length ;
// 此处是正向最大匹配
for (int i = 0; i < length; i++) {
index++ ;
head = head.get(chars[i]) ;
if(head==null){
if(isBack){
sb.append(tagBegin).append(chars,start,end).append(tagEnd) ;
start = start+end ;
i = start-1 ;
isBack = false ;
}else{
sb.append(chars,start,end) ;
i = start ;
start++ ;
}
head = this.frontbegin ;
index = 0 ;
end = 1 ;
continue ;
}
switch (head.getStatus()) {
case 1:
break ;
case 2:
end = index ;
isBack = true ;
break ;
case 3:
sb.append(tagBegin).append(chars,start,index).append(tagEnd) ;
start = start+index ;
index= 0 ;
end = 1 ;
isBack = false ;
head = this.frontbegin;
break ;
}
}
return sb.toString();
}
public static void main(String[] args) {
String[] keyWords = {"中华人民共和国","孙健","伟大","人民", "中华","万岁" };
long start = System.currentTimeMillis();
for (int i = 0; i < 1; i++) {
String str = new TagWord("<begin>", "<end>").addKeyWords(keyWords)
.getTagContent(
"中华人民共和国是一个伟大的民族我们有振兴民族的需要孙健万岁 . 中 国 万万岁哈哈 。");
System.out.println(str);
}
System.out.println(System.currentTimeMillis() - start);
}
}
class MakeLibrary {
public MakeLibrary() {
}
// 是否有下一个
private static boolean hasNext = true;
// 是否是一个词
private static boolean isWords = true;
Iterator<String> it = null;
public Branch getStringTree(Set<String> keyWords) {
it = keyWords.iterator();
Branch head = new Branch('h', 0, 0);
Branch branch = head ;
while (it.hasNext()) {
char[] chars = it.next().toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars.length == (i + 1)) {
isWords = true;
hasNext = false;
} else {
isWords = false;
hasNext = true;
}
int status = 1;
if (isWords && hasNext) {
status = 2;
}
if (!isWords && hasNext) {
status = 1;
}
if (isWords && !hasNext) {
status = 3;
}
branch.add(new Branch(chars[i], status, 0));
branch = (Branch) branch.get(chars[i]);
}
branch = head ;
}
return head;
}
}
interface WoodInterface {
public WoodInterface add(WoodInterface branch) ;
public WoodInterface get(char c) ;
public boolean contains(char c) ;
public int compareTo(char c) ;
public boolean equals(char c) ;
public byte getStatus() ;
public char getC() ;
public void setStatus(int status) ;
public byte getNature() ;
public void setNature(byte nature) ;
}
class Branch implements WoodInterface {
/**
* status 此字的状态1,继续 2,是个词语但是还可以继续 ,3确定
* nature 词语性质
* 0.未知 . 1是姓 . 2 是职位名称 3 是数量级的词 . 4 是数字词语 5 是标点
*/
WoodInterface[] branches = new WoodInterface[0];
private char c;
// 状态
private byte status = 1;
// 索引
private short index = -1;
// 词性
private byte nature = 0;
// 单独查找出来的对象
WoodInterface branch = null;
public WoodInterface add(WoodInterface branch) {
if ((this.branch=this.get(branch.getC()))!=null) {
switch (branch.getStatus()) {
case 1:
if(this.branch.getStatus()==2){
this.branch.setStatus(2) ;
}
if(this.branch.getStatus()==3){
this.branch.setStatus(2) ;
}
break;
case 2:
this.branch.setStatus(2) ;
case 3:
if(this.branch.getStatus()==2){
this.branch.setStatus(2) ;
}
if(this.branch.getStatus()==1){
this.branch.setStatus(2) ;
}
}
this.branch.setNature(branch.getNature()) ;
return this.branch;
}
index++;
if ((index + 1) > branches.length) {
branches = Arrays.copyOf(branches, index + 1);
}
branches[index] = branch;
AnsjArrays.sort(branches);
return branch;
}
public Branch(char c, int status, int nature) {
this.c = c;
this.status = (byte) status;
this.nature = (byte) nature;
}
int i = 0;
public WoodInterface get(char c) {
int i = AnsjArrays.binarySearch(branches, c);
if (i > -1) {
return branches[i];
}
return null;
}
public boolean contains(char c) {
if (AnsjArrays.binarySearch(branches, c) > -1) {
return true;
} else {
return false;
}
}
public int compareTo(char c) {
if (this.c > c) {
return 1;
}else if (this.c < c) {
return -1;
}else
return 0 ;
}
public boolean equals(char c) {
if (this.c == c) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return c;
}
public byte getStatus() {
return status;
}
public void setStatus(int status) {
this.status = (byte) status;
}
public char getC() {
return this.c;
}
public byte getNature() {
return nature;
}
public void setNature(byte nature) {
this.nature = nature;
}
}
class AnsjArrays {
private static final int INSERTIONSORT_THRESHOLD = 7;
/**
* 二分法查找.摘抄了jdk的东西..只不过把他的自动装箱功能给去掉了
*
* @param branches
* @param c
* @return
*/
public static int binarySearch(WoodInterface[] branches, char c) {
int high = branches.length - 1;
if (branches.length < 1) {
return high;
}
int low = 0;
while (low <= high) {
int mid = (low + high) >>> 1;
int cmp = branches[mid].compareTo(c);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -1; // key not found.
}
public static void sort(WoodInterface[] a) {
WoodInterface[] aux = (WoodInterface[])a.clone();
mergeSort(aux, a, 0, a.length, 0);
}
public static void sort(WoodInterface[] a, int fromIndex, int toIndex) {
rangeCheck(a.length, fromIndex, toIndex);
WoodInterface[] aux = copyOfRange(a, fromIndex, toIndex);
mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
}
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex
+ ") > toIndex(" + toIndex + ")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
private static void mergeSort(WoodInterface[] src, WoodInterface[] dest, int low,
int high, int off) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i = low; i < high; i++)
for (int j = i; j > low
&& (dest[j - 1]).compareTo(dest[j].getC()) > 0; j--)
swap(dest, j, j - 1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSort(dest, src, low, mid, -off);
mergeSort(dest, src, mid, high, -off);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (src[mid - 1].compareTo(src[mid].getC()) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// Merge sorted halves (now in src) into dest
for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid
&& src[p].compareTo(src[q].getC()) <= 0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
/**
* Swaps x[a] with x[b].
*/
private static void swap(WoodInterface[] x, int a, int b) {
WoodInterface t = x[a];
x[a] = x[b];
x[b] = t;
}
public static <T> T[] copyOfRange(T[] original, int from, int to) {
return copyOfRange(original, from, to, (Class<T[]>) original.getClass());
}
public static <T, U> T[] copyOfRange(U[] original, int from, int to,
Class<? extends T[]> newType) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
T[] copy = ((Object) newType == (Object) Object[].class) ? (T[]) new Object[newLength]
: (T[]) Array
.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, from, copy, 0, Math.min(original.length
- from, newLength));
return copy;
}
}
分享到:
相关推荐
总的来说,"element中automplate检索关键字并标红"是一个结合了前端开发、字符串处理和用户交互设计的综合问题。它涉及到的技能包括JavaScript编程、Vue.js组件开发、字符串匹配算法以及CSS样式设计,这些都是现代...
asp 仿baidu搜索多表搜索关键字标红 把我网站的搜索代码贴出来,绝对精品。功能强大。 演示网址:http://www.googcc.com.cn/search.asp 功能介绍: asp+access 仿百度搜索。 搜索关键词标红, 多表搜索 搜索翻页...
本文实例为大家分享了Android匹配关键字标红的具体代码,供大家参考,具体内容如下 1. 单关键字匹配 若只需匹配 搜索内容 可以写的简单一些,代码如下: if (name != null && name.contains(mKeyWord)) { int ...
在本文中,我们将探讨如何使用PHP实现一个简单的查询关键字描红功能。这个功能的主要目标是在网页上显示一段文本,并允许用户输入关键词进行搜索,搜索到的关键字将在文本中以红色加粗的方式突出显示。 首先,我们...
中国人 这种效果
一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例主要使用PHP 7中的文件操作函数对文件内容进行写入和读取操作,同时使用字符串替换...
实现JS多关键词高亮方法,可以改造查询条件直接引用该JS方法使用,更加简单简洁实现查询高亮关键词。多关键词当前以空格隔开演示。
总的来说,这个“VC语法关键字高亮显示类”是一个提高编程效率的实用工具,它将VC++的编程环境体验带给那些自定义开发工具的用户。通过引入和使用这个类,开发者可以专注于编写代码,而不必关心底层的语法处理细节,...
- **extends**: `extends`关键字用于继承,即一个类可以从另一个类那里继承状态(属性)和行为(方法)。继承支持类之间的“is-a”关系。例如,`Dog`类可以继承自`Animal`类: ```java public class Animal {} ...
利用jsp脚本语言实现页面搜索,非百度谷歌等搜索
sad多个关键字请用空格分多个关键字请多个关键字请用空格分用空格分
- 一个类如果有至少一个抽象方法,那么该类必须声明为抽象类,使用`abstract`关键字修饰,如`abstract class AbstractClass {}`。 - 抽象类不能被实例化,只能作为其他类的基类。如果一个类继承了抽象类,且不声明...
二叉排序树,其中有一个关键字,可以通过关键字的大小排序~~
然而,对于搜索关键字高亮的需求,我们通常需要自定义一个过滤器。下面是如何创建这样一个过滤器的步骤: 1. 定义过滤器: 在 Angular 应用中,我们可以通过 `app.filter()` 方法创建自定义过滤器。这个过滤器将会...
我们可以定义一个类选择器,将关键字的高亮样式写入CSS中,然后在HTML中应用这个类。 ```css .keyword { color: red; } ``` ```html 这是一个例子,我们将"例子"两个字飘红</span></p> ``` 3. **JavaScript**:...
最近做了一个日志搜索的需求,要在页面上实现海量日志的关键字搜索。为了搜索更清晰,我最终实现了多条件搜索,且搜索结果的记录中的关键字全部高亮。 一、实现思路 1 实时监控表格,实现关键字的定位; 2 点击搜索...
* char:单字节整型数据,占用一个字节的存储空间,用于定义字符变量。 * double:双精度浮点型数据,占用八个字节的存储空间,用于定义浮点数变量。 * float:单精度浮点型数据,占用四个字节的存储空间,用于定义...
虽然Java中存在`goto`关键字,但它并未被启用,因此实际上不被视为一个有效的关键字。 掌握这些关键字对于编写高效、健壯的Java程序至关重要,它们构成了Java语言的核心语法,帮助程序员构建复杂的应用逻辑。