2014-02-24 40 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

相关问题