【发布时间】:2013-12-25 06:56:23
【问题描述】:
我正在尝试创建一个匹配程序,当给定某个单词的正则表达式时说“C[A-Z]T”,从单词列表中找到与该正则表达式匹配的所有单词。我的示例中的匹配项是 CAT、CUT、COT。
我的目标是尽可能快地处理非常大的单词列表。我尝试过使用 Java 的 TreeSet 来实现,但是搜索需要很长时间,因为我必须遍历 Tree 中的每个单词。即使我在将列表放入树之前随机化列表,搜索也太慢了。
所以我的问题是,我可以使用内部 Contains(),还是 Java 提供的其他数据结构可以与正则表达式一起使用?谢谢..
我正在考虑使用 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;
}
}
【问题讨论】:
标签: java regex search optimization tree