!1259 https://gitee.com/dromara/hutool/issues/I8OJQZ AC自动机实现 添加测试用例 以及发现代码缺陷进行bug修复

Merge pull request !1259 from 好人难当/v6-dev
This commit is contained in:
Looly 2024-08-12 10:52:33 +00:00 committed by Gitee
commit ed62d100a4
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 106 additions and 3 deletions

View File

@ -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;

View File

@ -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);
});
}
}

View File

@ -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);
}
}