您好我正在用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