簡體   English   中英

檢查哈希映射和迭代哈希映射中的鍵之間的區別

[英]Difference between checking hash map and iterating through keys in hash map

我有一個單詞列表,每個單詞都有相應的分數。 我正在梳理並匹配.txt文件中的大塊文本中的每個單詞和單詞列表中的單詞。 .txt文件最多可包含10,000行文本。

當我第一次這樣做時,我使用了一種非常強力和天真的方法來匹配我的單詞列表中的單詞與我的.txt文件。 雖然我使用了哈希映射,但我沒有正確使用哈希映射,並且可能也將它用作列表。 所以代碼是用以下方式編寫的:

for(int i=0; i<words.length; i++){
    for(int j=0; j<wordListType.size(); j++){
        Map<String, Integer> hmap = wordListType.get(j).getMap();
        for(Map.Entry<String, Integer> entry : hmap.entrySet()){
            if(words[i].contains(entry.getKey())){
                foo();
            }
        }
    }
}

單詞是一個String [],包含文本文件中的單個單詞。 wordListType是一個類的ArrayList,它包含我正在搜索的關鍵字的哈希映射。 它是一個ArrayList,因為有多種類型的單詞列表。 getMap()是我自己在WordList類中的輔助方法。

之后,我發現我的代碼效率低下,並且我沒有使用我的哈希映射來充分發揮其優勢。 所以我將代碼更改為以下內容:

for(int i=0; i<words.length; i++){
    for(int j=0; j<wordListType.size(); j++){
        Map<String, Integer> hmap = wordListType.get(j).getMap();
        Integer val = null;
        if((val = hmap.get(words[i])) != null){
            foo();
        }
    }
}

這樣我就不會像使用第一個方法那樣瀏覽hmap中的每個鍵,而是使用O(1)HashMap.get()方法。

但是,第二種有效的方法並不能產生我想要的結果。

我不太確定為什么這些單詞的匹配方式不同。 從我所看到的,他們都應該提供完全相同的答案,除了我的后一個代碼應該更快。 相反,迭代哈希映射的所有鍵的第一種方法實際上產生了我想要的結果(我手動檢查了這個),而第二種方法沒有。

我的哈希映射中沒有空值,我已經測試過了。 我已經查找了哈希映射的實現,所以我不太明白為什么這不起作用。 我在這里遺漏了什么,或者是否有其他不相關的因素影響了我的結果? 任何幫助深表感謝。

如果我得到正確的words[i]是一個String 在第一個解決方案中,您將匹配具有映射鍵的每個單詞作為子字符串。 第二種情況是你完全匹配。

這個:

words[i].contains(entry.getKey())

將匹配具有entry.getKey() ssubstring的每個單詞。 即它將匹配alabala的字符串ala

在這里:

(val = hmap.get(words[k])) != null

哪個更好寫:

hmap.contains(words[k])

檢查地圖是否包含與給定單詞完全匹配的鍵。 在這種情況下, alaalabala這個詞不匹配。

如果您使用的兩個條件不測試相同的東西。 讓我們舉個例子,其中words[i]被“測試”,你的地圖包含關鍵字“test”:

if(words[i].contains(entry.getKey())) {

此條件檢查您的Word [i]是否包含您的地圖密鑰,這意味着將評估if塊。

if((val = hmap.get(words[k])) != null){

這個條件檢查你的地圖是否包含字符串字[k](“測試”),它將評估為false,因為它只包含“test”。

我相信對於您的用例,第二個實現會給出您正在尋找的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM