您好我正在使用dictionary.txt文件填充Hashmap,并且我将散列映射分成多组字长。
我无法在Hashmap中搜索“a * d ** k”的模式;
任何人都可以帮助我吗?
我需要知道如何搜索Hashmap?
如果你能帮助我,我真的很感激。 谢谢。
答案 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;
}
}