您好我正在用dictionary.txt文件填充一个哈希映射,我将哈希映射分成多组字长。搜索一个哈希映射
我无法搜索哈希图的模式“a * d ** k”;
任何人都可以帮助我吗?
我需要知道如何搜索Hashmap?
我真的很感激,如果你能帮助我。 谢谢。
您好我正在用dictionary.txt文件填充一个哈希映射,我将哈希映射分成多组字长。搜索一个哈希映射
我无法搜索哈希图的模式“a * d ** k”;
任何人都可以帮助我吗?
我需要知道如何搜索Hashmap?
我真的很感激,如果你能帮助我。 谢谢。
A HashMap
仅仅是模式搜索的错误数据结构。
你应该考虑这样做的特征模式搜索开箱即用的技术,如Lucene
而且在回答此评论:用它为Android
1m,并其 最快的搜索方式。
HashMaps
非常快,这是真的,但只有当您按照预期使用它们时才是如此。在你的场景中,散列码并不重要,因为你知道所有的键都是数字的,你可能不会有比30个字母更长的单词。
那么,为什么不直接使用集合的Array或ArrayList来代替HashMap,而是用list.get(string.length()-1)
或array[string.length()-1]
来代替map.get(string.length())
。我敢打赌,性能会比使用HashMap更好(但我们无法分辨出这些差别,除非您拥有旧的机器或者条目)。
我并不是说我的设计使用List或Array更好,但是您使用的数据结构仅用于不适用的目的。
严重:如何写作对你的话到平面文件(每行一个词,由词长排序,然后是按字母顺序),只是运行在该文件中的正则表达式查询?如果文件太大,请对文件进行流式处理并搜索各个行,或者将它作为字符串读取,并在IO速度太慢时将其保存在内存中。
或者怎么样只用一个自定义Comparator
一个TreeSet
?
示例代码:
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;
}
}
我需要在代码中使用哈希映射。 – 2011-04-06 15:22:56
@Steven为什么?这是作业吗? – 2011-04-06 15:53:45
我使用它为Android,它是最快的搜索方式。 – 2011-04-06 19:42:17
你将不得不写产生设置内容为一个字符串的函数 - 在“的toString()”方法将无法做到这一点。 – Pointy 2011-04-06 14:01:20
我使用这种方法从集合中获取单个字符串,但它只给出第一个字符串。'公共静态字符串getSingleString(集S) \t { \t \t \t 而\t { \t \t \t串m = s.iterator()的next()的toString()(s.isEmpty()!)。; \t \t \t return m; \t \t \t \t \t \t \t \t} \t \t返回NULL; \t \t \t}' – 2011-04-06 15:25:51
那么,该函数肯定只会返回第一个字符串。你设置while循环,它获得Set的第一个元素并立即返回它。 – Pointy 2011-04-06 15:28:40