搜索Hashmap

时间:2011-04-06 13:57:29

标签: java design-patterns

您好我正在使用dictionary.txt文件填充Hashmap,并且我将散列映射分成多组字长。

我无法在Hashmap中搜索“a * d ** k”的模式;

任何人都可以帮助我吗?

我需要知道如何搜索Hashmap?

如果你能帮助我,我真的很感激。 谢谢。

1 个答案:

答案 0 :(得分:4)

HashMap只是模式搜索的错误数据结构。

您应该研究开箱即用的模式搜索技术,例如Lucene


回答这个评论:

  

我将它用于Android,用于Android   最快的搜索方式

HashMaps非常快,这是真的,但前提是你按照预期使用它们。在您的场景中,哈希码并不重要,因为您知道所有键都是数字的,并且您可能没有任何长于30个字母的单词。

那么为什么不使用Sets的Array或ArrayList而不是HashMap,并将map.get(string.length())替换为list.get(string.length()-1)array[string.length()-1]。我敢打赌,性能会比使用HashMap更好(但我们无法分辨出差异,除非你有一台旧的机器或者很多条目)。

我不是说我使用List或Array的设计更好,但您使用的数据结构不是为了它的目的。


严重:如何将所有单词写入平面文件(每行一个单词,按字长排序,然后按字母顺序排序),然后只对该文件运行正则表达式查询?如果文件太大,则流式传输文件并搜索各行,或者将其作为字符串读取,如果IO太慢,则将其保留在内存中。


或者如何将TreeSet与自定义Comparator一起使用?

示例代码:

public class PatternSearch{

    enum StringComparator implements Comparator<String>{
        LENGTH_THEN_ALPHA{

            @Override
            public int compare(final String first, final String second){

                // compare lengths
                int result =
                    Integer.valueOf(first.length()).compareTo(
                        Integer.valueOf(second.length()));
                // and if they are the same, compare contents
                if(result == 0){
                    result = first.compareTo(second);
                }

                return result;
            }
        }
    }

    private final SortedSet<String> data =
        new TreeSet<String>(StringComparator.LENGTH_THEN_ALPHA);

    public boolean addWord(final String word){
        return data.add(word.toLowerCase());
    }

    public Set<String> findByPattern(final String patternString){
        final Pattern pattern =
            Pattern.compile(patternString.toLowerCase().replace('*', '.'));
        final Set<String> results = new TreeSet<String>();
        for(final String word : data.subSet(
            // this should probably be optimized :-)
            patternString.replaceAll(".", "a"),
            patternString.replaceAll(".", "z"))){
            if(pattern.matcher(word).matches()){
                results.add(word);
            }
        }
        return results;
    }

}