【问题标题】:Using regex with Java's TreeSet or Collections.BinarySearch将正则表达式与 Java 的 TreeSet 或 Collections.BinarySearch 一起使用
【发布时间】: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


    【解决方案1】:

    如果您事先知道您的正则表达式/模式,您可以构建类似布隆过滤器的东西,但这与构建 Collections(如 matchesPattern0matchesPattern1 等)并没有太大区别,那就是基本上数据库的索引是如何工作的。您可能还只想要一个前缀树。

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

    如果你觉得自己很聪明并且迫切需要这个,那么最好的办法是将Pattern 转换为“最小值”和“最大值”,所以CATD,然后使用@ 987654328@,并对结果应用过滤器。但实际上,这种优化很少奏效。

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 2016-12-29
      • 2011-06-19
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多