2012-04-14 31 views
2

讓Person爲屬性名稱,年齡和idNumber的類。我希望收集「人員」,我希望能夠以最有效的方式執行以下操作:相同對象上的多個數據結構

  1. 通過其ID號碼檢索它們。
  2. 獲取年齡> X的人員列表。
  3. 獲取所有按名稱按字母順序排序的人員列表。

我的想法是同時使用id作爲鍵和兩個使用年齡和名稱作爲每個TreeMaps的鍵的Treemaps來維護Hashmap。

  1. 這是最好的方法嗎?
  2. 是否有必要在編輯年齡之前從年齡TreeMap中移除一個人然後重新放回?
  3. 如果對問題2的回答是肯定的,那麼當這些人被使用並可能在多個地方進行編輯時,我該如何處理?
+0

-

順便說一句,如果你嘗試它體改後,刪除對象,你會失敗(大部分)連續的,你可能會使用一個普通的數組。 – Kevin 2012-04-14 16:07:19

+0

這是「國家識別號碼」,不是真的連續:) – bluehallu 2012-04-14 16:08:57

+0

對於名稱,你應該考慮使用['trie'](http://en.wikipedia.org/wiki/Trie) – Kevin 2012-04-14 16:54:25

回答

2

這是最好的方法嗎?

我會說使用關係數據庫和適當的索引是最好的方法,但如果你想在內存中這樣做,那麼是的 - 你犧牲了內存的性能。

是否有必要在編輯年齡之前從年齡TreeMap中刪除一個人然後將其放回?

是的。一個項目在樹中的位置在添加時確定一次。如果可比較屬性(agename)發生更改,則TreeMap不會神奇地發現並移動該對象。這很可能會導致無法在地圖中查找元素,即使它在那裏。

如果對問題2的回答是肯定的,那麼當這些人正在使用並可能在多個地方進行編輯時,如何處理?

首選不可變對象,因此無法更改已放置在樹中的對象。如果由於任何原因您無法負擔得起,請考慮模式 - 將Person存儲在地圖中時,請在該Person中註冊偵聽器。當例如age更改,聽衆通過年齡通知樹(或其他觀察者)存儲人,並處理刪除和添加回來。如果`id`將是TreeMap將不再能夠找到一個對象被刪除...