2014-02-24 43 views
0

我:Map<Long, Peer>,其中關鍵是peerUidvaluePeer。每個Peer是像用戶會話的容器,幷包含UserAuthorities快速的方式來表示地圖<K, V>作爲地圖<U, List<V>>

public class Peer { 
    private UserAuthorities authorities; 
    //... 
} 

我需要:

快速完成:

  1. [中要求的一半]獲取所有的同行:List<Peer>
  2. [在每個請求中]獲取由UserAuthorities分組的所有對等:Map<UserAuthorities, List<Peer>>
  3. [一次瀏覽器選項卡]添加新的對等(與空UserAuthorities和一段時間後,設置用戶權限)
  4. [arrely]由UserAuthorities
  5. 最後刪除由peerUid對等體的實現上述併發所有四項聲明環境

問題:

此刻當我添加新Peer到地圖上,我沒有UserAuthorities。這意味着UserAuthorities是可變的。

問題:

  1. 有沒有什麼辦法讓從Map<Long, Peer>迅速Map<UserAuthorities, List<Peer>>? (對等體的近似數目約爲20;但是這個動作將在每個用戶請求上進行)
  2. 如果不是,如果Peer.userAuthorities是可變域,我該如何實現?

P.S:UserAuthorities改變?

答案很簡單 - 只有登錄一次。用戶轉到主頁,他在服務器端獲得Peer,但尚未獲得任何權限。所以他沉浸在並得到它們。

+0

你的意思是* group by *'UserAuthorities'? –

+0

@RohitJain是API的方法嗎? –

+0

不是,只是問問你說*排序*,但看起來更像是分組。 –

回答

-1
  1. 檢查Map API:Map#values()
  2. 檢查Map API:Map#remove()
+0

我熟悉map API。map @ values()比使用UserDetails參數對列表進行排序,我應該遍歷所有列表O(n)並執行O(n)'equals'調用。這是非常緩慢的 –

+0

是的,你可以保留另一個視圖上的地圖值按某些參數排序,並支持具體值,如果這顯着提高你的速度。 – Smutje

1

這不是一個答案,所以在技術上,它可能已被刪除 - 然而這樣的事情很難在評論中討論...:

所以我假設數據結構應該像這個接口LoginDatastructure,這是正確的嗎?

import java.util.List; 
import java.util.Map; 

class UserAuthorities {} 
class Peer 
{ 
    private UserAuthorities authorities; 
} 

interface LoginDatastructure 
{ 
    // 1. Get all peers 
    List<Peer> getAllPeers(); 

    // 2. Get all peers grouped by UserAuthorities 
    Map<UserAuthorities, List<Peer>> getPeersByUserAuthority(); 

    // 3. Add new peer (with null UserAuthorities 
    // and after some time set user authorities) 
    void addPeer(Peer peer); 

    // 4a Remove peer by peerUid 
    void removePeer(long peerUid); 

    // 4b. Remove peer by peerUid or all peers by UserAuthorities 
    void removePeers(UserAuthorities u); 
} 

在這個例子中你的Map<Long, Peer>發生了什麼?

關於3:當添加了對等體,並且它具有UserAuthority時,它是否應包含在方法1返回的列表中?它應該包含在方法2返回的地圖中嗎?

List<Peer> peersWithNull = map.get(null); 

關於UserAuthority的更改:當用戶權限更改時,是否可以通過通知該數據結構?也就是說,可以在LoginDatastructure有像

void userAuthorityWasSet(Peer peer); 

當給定對等的UserAuthority改變,將調用額外的方法是什麼?

關於第5點,併發性:是否有任何理由不公然地使所有這些方法​​?


編輯:關於同步:你期望什麼樣的線程安全?例如,當添加一個Peer時,是否應該自動在所有可能從方法2的Map中獲得的列表中看到?這些清單是否應該在權威機構設置時更新?無論如何,到目前爲止,這些方法主要是在數據結構中添加/刪除元素,所以我認爲使它們不會有任何顯着的性能影響(當然,除非地圖這樣的數據結構是每次通話過程中從頭開始重建 - 但我認爲你想無論如何避免這種

在任何情況下,我有一種感覺,StackOverflow的可能不是正確的地方爲這種討論的....

+0

有關#3的回答是:應包括具有「空」權限的同行。另外更改UserAuthorities的方法是在我的類中,我可以修改它。最後 - 對我來說,做所有方法都是'synchronized'似乎是個壞主意,因爲我的應用程序基於非阻塞io(websockets),並且會有許多用戶同時對相同的同伴集合進行操作。 –

+0

@Volodymyr Bakhmatiuk增加了編輯功能,但認爲這很難在這裏很快得到解決方案...... – Marco13

相關問題