2011-10-31 51 views
1

我對HashMaps有疑問。我們正在編寫一個small-c(-ish)編譯器,爲此我們使用了一個符號表。我們正在使用hashmap來實現這一點。Java HashMap重複存儲桶條目

現在考慮範圍我們使用堆棧。所以每次我們進入一個新的作用域時,我們都會在堆棧上推送一個表示這個標記的標記。然後,我們將hashmap中的所有密鑰放在堆棧中,以查找我們遇到的所有符號。到現在爲止還挺好。

當我們退出範圍時,我們彈出堆棧直到達到令牌。我們之前通過的每個符號都必須從我們的散列圖中刪除。

考慮下面的代碼:

{ 
    a = 5; 
    { 
     a = 5; 
    } 
} 

將HashMap中能接受嗎?如在,我會輸入他們作爲一個關鍵。這不會是一個問題,但是當彈出並刪除它們時,Java能夠在這兩個對象之間做出區別嗎?或者第二個會覆蓋第一個?

回答

1

地圖的javadoc

將鍵映射到值的對象。地圖不能包含重複 鍵;每個鍵可以映射到最多一個值。

+0

我讀過它。但的確,這回答了它。 – KWyckmans

3

我認爲使用樹木是更好的解決方案。樹的每個節點定義變量的可見性塊。在嵌套塊的情況下,葉節點將覆蓋變量的值。

+0

嗯,我們將討論這種可能性。 – KWyckmans

1

不,這不起作用,因爲您可能只有一個給定的鍵值在地圖上。

我會在範圍之間使用委託機制。當您輸入新範圍時,創建一個新的範圍對象,並將此範圍中定義的每個新符號存儲在SCope對象包含的映射中。使Scope對象指向它的封閉Scope(並因此委託給此封閉Scope查找不在映射中的變量的值),然後將創建的SCope設置爲當前值。一旦您退出該塊,只需將結束範圍的封閉範圍作爲當前範圍即可。

1

我想爲您推薦2種解決方案。

  1. 地圖的用戶地圖。這是JNDI的工作原理。每個名稱空間都可以包含變量本身和映射自身的子上下文,並且可以包含其級別的變量。
  2. 使用點符號表示鍵。對於第一個在外部環境中定義的變量a而言是1.a,而對於第二個是1.1.a。
+0

想一想吧! – KWyckmans