2016-05-25 21 views
0

Golang中的地圖如何比較鍵?出於某種原因,我需要一個結構作爲一個關鍵,其中有2個值。我想要映射比較只有第一個值,而不是第二個。其次是爲了我的使用。像在java中一樣,我可以自定義equals方法,所以地圖裏面只有logically equal個鍵。有沒有辦法做到這一點?在Golang中,如果我將結構作爲關鍵字,我可以自定義鍵比較嗎?

編輯:看起來沒有辦法做到這一點。所以我現在把我的問題放在這裏。請幫助我在'Go-way'中思考。

所以,我想實現一個'定時映射',它跟蹤鍵的插入時間。換句話說,有一個接受和處理值的地圖。現在,如果地圖中的數據比特定的時間間隔更早,那麼我應該清除它。

所以,我想有一個關鍵的結構,它有ID和時間戳。當一個新的密鑰出現時,map會將其與id和currentTimeInMillis一起使用。過了一段時間,如果一個關鍵字已經存在,那麼map應該保留第一次插入時間並且只更新值數組。

爲了處理,我將有一個循環映射,並檢查是否有任何特定的鍵內部超過閾值限制,然後我清除它。我可以在值數組中有這個時間戳,但也有它自己的時間戳,所以再加一個可能會混淆別人。

請提出建議。

+1

不,你不能改變地圖散列的方式。 – JimB

+0

哦,這是個壞消息。我需要找到一些替代方案。 Golang非常「有限」。 :-( – theGamblerRises

+4

@theGamblerRises不限制你想做什麼?不要在golang中實現java代碼 – khrm

回答

0

把時間放在你的價值上。以下是如何構建數據的一些示例。

type DataObj struct { 
    Id int 
    Updated time.Date 
    // other fields 
} 

m := map[int]DataObj{} 
m[d.Id] = d // assign using the id as your key 

for k, v := range m { 
    if time.Since(v.Updated) > duration { 
     delete(m, k) // remove the stale item 
    } 
} 

// some logic like this for adding/overwriting 
v, ok := m[newObj.Id] 
if ok { // an element with this id existed 
    if time.Since(v.Updated) > duration { 
      m[v.Id] = newObj // assign new value over old one 
    } 
} 

我不能提供任何更具體的因爲你沒有任何代碼與工作。看起來你可能會喜歡其中的一些(如刪除位)在計時器上運行。爲此,請將該函數作爲goroutine調用,並使用一個計時器,以便每隔X秒解除阻止並從地圖中移除項目。如果你這樣做,你還需要使用互斥鎖,以便調用範圍不會訪問映射,而運行後臺的remove功能會過濾掉舊項目。

覆蓋位是非常直接的,只是測試項目是否在地圖中,檢查它的時間戳,如果超出閾值分配新值,如果不是什麼都不做。

這裏帶走的主要內容是不要使用結構體作爲鍵......沒有理由做對象平等,你的對象有一個id,我們把它當作你的關鍵。你關心的其他一切都可以保持在價值上(即使是關鍵本身)。正如有人指出,這不是Java,即使它是,在C#和Java平等覆蓋字面上是一個他媽的噩夢。

+0

謝謝你。我現在正在用值的時間戳。我將用我的解決方案進行更新。除此之外,Java中的平等覆蓋對我來說非常方便。我喜歡golang,因爲它簡單,處理速度更快。但是Java對我來說太美了,**個人看法**。 – theGamblerRises

+0

@theGamblerRise是不喜歡覆蓋只是一個意見問題。他們可以使代碼看起來不錯,但我認爲他們使得在大型項目中難以維護,如果您以後發現需要做參考比較,它會使您處於一個相當粗糙的位置。 – evanmcdonnal

相關問題