mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
!1259 https://gitee.com/dromara/hutool/issues/I8OJQZ AC自动机实现 添加测试用例 以及发现代码缺陷进行bug修复
Merge pull request !1259 from 好人难当/v6-dev
This commit is contained in:
commit
ed62d100a4
@ -61,7 +61,7 @@ public class HighMultiReplacerV2 extends StrReplacer {
|
||||
final char ch = text.charAt(i);
|
||||
final Integer index = charIndexMap.get(ch);
|
||||
// 下一个字符在候选转换字符串中都不存在 ch字符一定不会被替换
|
||||
if(index < 0){
|
||||
if(index == null || index < 0){
|
||||
// 临时缓存空间中的数据写入到输出的 StringBuilder
|
||||
if(temp.length() > 0){
|
||||
stringBuilder.append(temp);
|
||||
@ -92,14 +92,16 @@ public class HighMultiReplacerV2 extends StrReplacer {
|
||||
|
||||
// 表示匹配到 现在进行字符串替换工作
|
||||
if(currentNode.isEnd){
|
||||
final int length = currentNode.tagetString.length();
|
||||
final int length = currentNode.tagetString.length() - 1;
|
||||
// 先清理匹配到的字符 最后一个字符未加入临时空间
|
||||
temp.delete(temp.length() - length + 1,length - 1);
|
||||
temp.delete(temp.length() - length,temp.length());
|
||||
if(temp.length() > 0){
|
||||
stringBuilder.append(temp);
|
||||
}
|
||||
// 写入被替换的字符串
|
||||
stringBuilder.append(replaceMap.get(currentNode.tagetString));
|
||||
// 将临时空间删除
|
||||
temp.delete(0, temp.length());
|
||||
// 因为字符串被替换过了 所以当前节点重新指向 root
|
||||
currentNode = root;
|
||||
continue;
|
||||
|
@ -0,0 +1,50 @@
|
||||
package org.dromara.hutool.core.text.finder;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cmm
|
||||
* @date 2024/8/12 11:16
|
||||
*/
|
||||
public class MultiStrFinderTest {
|
||||
|
||||
@Test
|
||||
public void test1(){
|
||||
ArrayList<String> strings = new ArrayList<>();
|
||||
strings.add("sha");
|
||||
strings.add("asa");
|
||||
strings.add("ha");
|
||||
strings.add("hex");
|
||||
MultiStrFinder finder = MultiStrFinder.of(strings);
|
||||
String text = "asdasahhxxeshaaahexaaasa";
|
||||
Map<String, List<Integer>> match = finder.findMatch(text);
|
||||
System.out.println(text);
|
||||
match.forEach((k,v) -> {
|
||||
System.out.println(k + ":" + v);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test2(){
|
||||
ArrayList<String> strings = new ArrayList<>();
|
||||
strings.add("沙漠");
|
||||
strings.add("撒");
|
||||
strings.add("哈");
|
||||
strings.add("害克斯");
|
||||
MultiStrFinder finder = MultiStrFinder.of(strings);
|
||||
String text = "撒哈拉大沙漠,你看哈哈哈。hex码中文写成海克斯科技";
|
||||
Map<String, List<Integer>> match = finder.findMatch(text);
|
||||
System.out.println(text);
|
||||
match.forEach((k,v) -> {
|
||||
System.out.println(k + ":" + v);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package org.dromara.hutool.core.text.replacer;
|
||||
|
||||
import org.dromara.hutool.core.text.finder.MultiStrFinder;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author cmm
|
||||
* @date 2024/8/12 14:49
|
||||
*/
|
||||
public class HighMultiReplacerV2Test {
|
||||
@Test
|
||||
public void test1(){
|
||||
HashMap<String, String> replaceMap = new HashMap<>();
|
||||
replaceMap.put("sha","SHA");
|
||||
replaceMap.put("asa","ASA");
|
||||
replaceMap.put("ha","HA");
|
||||
replaceMap.put("hex","HEX");
|
||||
HighMultiReplacerV2 replacer = new HighMultiReplacerV2(replaceMap);
|
||||
String text = "asdasahhxxeshaaahexaaasa";
|
||||
CharSequence apply = replacer.apply(text);
|
||||
replaceMap.forEach((k,v) -> {
|
||||
System.out.println(k + ":" + v);
|
||||
});
|
||||
System.out.println(text);
|
||||
System.out.println(apply);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test2(){
|
||||
HashMap<String, String> replaceMap = new HashMap<>();
|
||||
replaceMap.put("沙漠","什么");
|
||||
replaceMap.put("撒","厦");
|
||||
replaceMap.put("哈","蛤");
|
||||
replaceMap.put("海克斯","害可是");
|
||||
HighMultiReplacerV2 replacer = new HighMultiReplacerV2(replaceMap);
|
||||
String text = "撒哈拉大沙漠,你看哈哈哈。hex码中文写成海克斯科技,海克,沙子收拾收拾,撤退,撒下了句点";
|
||||
CharSequence apply = replacer.apply(text);
|
||||
replaceMap.forEach((k,v) -> {
|
||||
System.out.println(k + ":" + v);
|
||||
});
|
||||
System.out.println(text);
|
||||
System.out.println(apply);
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user