Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将regex与Java';s TreeSet或Collections.BinarySearch_Java_Regex_Search_Optimization_Tree - Fatal编程技术网

将regex与Java';s TreeSet或Collections.BinarySearch

将regex与Java';s TreeSet或Collections.BinarySearch,java,regex,search,optimization,tree,Java,Regex,Search,Optimization,Tree,我正在尝试创建一个匹配程序,当为一个单词指定一些正则表达式时,比如“C[a-Z]T”,从一个单词列表中找到所有与该正则表达式匹配的单词。以我为例,匹配项是CAT、CUT、COT 我的目标是尽可能快地处理非常大的单词列表。我曾尝试使用Java的TreeSet实现,但搜索需要非常长的时间,因为我必须迭代树中的每个单词。即使在将列表放入树之前将其随机化,搜索速度也太慢 所以我的问题是,我可以使用internal Contains(),还是Java提供的其他数据结构可以与regex一起工作?谢谢 我正在

我正在尝试创建一个匹配程序,当为一个单词指定一些正则表达式时,比如“C[a-Z]T”,从一个单词列表中找到所有与该正则表达式匹配的单词。以我为例,匹配项是CAT、CUT、COT

我的目标是尽可能快地处理非常大的单词列表。我曾尝试使用Java的TreeSet实现,但搜索需要非常长的时间,因为我必须迭代树中的每个单词。即使在将列表放入树之前将其随机化,搜索速度也太慢

所以我的问题是,我可以使用internal Contains(),还是Java提供的其他数据结构可以与regex一起工作?谢谢

我正在考虑使用AVL或红黑“hashmap”(但不是真的),长度作为键,单词作为值。这意味着我需要允许多个相同的键,但每个键映射到不同的值。因此,我的get将返回一个值列表,而不是单个值。有没有什么地方可以找到这种数据结构的实现?或者至少是一个让我开始的基地。。我真的不想自己滚

以下是我目前的代码:

public class WordSearch {
    SortedSet<String> tree = new TreeSet<String>();
    List<String> list = new ArrayList<String>();

    public WordSearch(List<String> allWords) {
        // long seed = System.nanoTime();
        // Collections.shuffle(allWords, new Random(seed)); // randomize
        tree.addAll(allWords);
    }

    public List<String> solutions(String pattern, int max) {
        pattern = pattern.toLowerCase().toUpperCase();
        pattern = pattern.replace("*", "[A-Z]");
        Pattern find = Pattern.compile(pattern);
        int count = 0;
        ArrayList<String> result = new ArrayList<String>();
        Iterator<String> it = tree.iterator();
        while (count < max) {
            while (it.hasNext()) {
                String word = it.next().toLowerCase().toUpperCase();
                Matcher match = find.matcher(word);
                if (match.matches()) {
                    result.add(word);
                    count++;
                }
            }
            break;
        }
        return result;
    }
}
公共类单词搜索{
SortedSet树=新树集();
列表=新的ArrayList();
公共单词搜索(列出所有单词){
//长种子=System.nanoTime();
//Collections.shuffle(allWords,newrandom(种子));//随机化
tree.addAll(allWords);
}
公共列表解决方案(字符串模式,int max){
pattern=pattern.toLowerCase().toUpperCase();
模式=模式。替换(“*”,“[A-Z]”);
Pattern find=Pattern.compile(Pattern);
整数计数=0;
ArrayList结果=新建ArrayList();
迭代器it=tree.Iterator();
同时(计数<最大值){
while(it.hasNext()){
String word=it.next().toLowerCase().toUpperCase();
Matcher match=find.Matcher(word);
if(match.matches()){
结果:添加(word);
计数++;
}
}
打破
}
返回结果;
}
}

如果您事先知道您的正则表达式/模式,您可以构建类似bloom过滤器的东西,但这与构建
集合
没有什么区别,比如
匹配模式0
匹配模式1
,等等,而数据库的索引基本上就是这样工作的。您可能还需要一个前缀树

在您的情况下,数据结构唯一有帮助的方法是对正则表达式进行锚定,即指定第一个或最后一个字符或字符范围。否则,无论如何,您必须检查整个数据结构。基本上,
^C[A-Z]T$
案例非常具体,没有人为此构建优化的数据结构


如果你觉得自己很聪明并且非常需要这个,那么最好的方法是将
模式
转换为“min”和“max”,因此
CAT
D
,然后使用
SortedSet.subSet
,并对结果应用过滤器。但实际上,这种优化很少起作用。

如果您事先知道您的正则表达式/模式,您可以构建类似bloom过滤器的东西,但这与构建
集合
匹配模式0
匹配模式1
等并没有多大区别。,这就是数据库索引的基本工作原理。您可能还需要一个前缀树

在您的情况下,数据结构唯一有帮助的方法是对正则表达式进行锚定,即指定第一个或最后一个字符或字符范围。否则,无论如何,您必须检查整个数据结构。基本上,
^C[A-Z]T$
案例非常具体,没有人为此构建优化的数据结构

如果你觉得自己很聪明并且非常需要这个,那么最好的方法是将
模式
转换为“min”和“max”,因此
CAT
D
,然后使用
SortedSet.subSet
,并对结果应用过滤器。但实际上,这种优化很少奏效