2014-10-07 63 views
0

我在這裏遇到無限循環。我需要幫助在這裏找到一個邊緣案例,我可能沒有考慮過。 (鍵,值)對的數組。 isRemoved()標記表的一個元素,如果它已被刪除。遇到無限循環

index從'key'的哈希函數派生...在這裏我試圖添加一個元素到散列表。

int removed = -1; 
      while (table[index] != null) { 
       if (table[index].isRemoved()) { 
        if (removed != -1) { 
         removed = index; 
        } 
       } else { 
        if (key.equals(table[index].getKey())) { 
         dData = table[index].getValue(); 
         table[index].setValue(value); 
         return dData; 
        } else { 
         index++; 
         index %= startingSize; 
        } 
       } 
      } 
      if (removed != -1) { 
       index = removed; 
      } 

回答

0
  • 你的邏輯不添加元素,但更新現有值。
  • 此外,你有一個循環邏輯。擺脫「index%= startSize;」
  • 當索引達到表大小時,你確定表[索引]將爲空嗎?
+0

它不必更新現有值。我試圖通過線性探測來解決衝突。所以如果一個索引被佔用,這個值應該檢查下一個索引。如果是,則檢查下一個,直到找到空索引爲止。如果到了最後,它應該回到零並開始。 因此,表[索引]可能或可能不爲空 – 2014-10-07 04:31:25

+0

您的第一個問題是「這裏我試圖添加一個元素到散列表」。無論如何,當你意識到第一遍沒有碰撞時,爲什麼你要回到零點並重新開始呢?你是否期望表單在一個單獨的線程中被更新,然後顯然同步部分不被關注。 – KiranCK 2014-10-07 05:04:51

0

在該第一if

if (table[index].isRemoved()) { 
       if (removed != -1) { 
        removed = index; 
       } 
} 

索引沒有被增量並且沒有其他代碼訪問

+0

所以我在if條件中遞增索引。它仍然是一個無限循環。 – 2014-10-07 04:05:52