快速表示Map <k,v =“”>作为Map <u,list <v =“”>&gt; </u,> </k,>

时间:2014-02-24 15:10:39

标签: java collections map concurrency

我有: Map<Long, Peer>,其中密钥为peerUidvaluePeer。每个Peer类似于用户会话容器,包含UserAuthorities

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

我需要:

快速做:

  1. [半数请求]获取所有同行:List<Peer>
  2. [在每个请求中]获取按UserAuthorities分组的所有同行:Map<UserAuthorities, List<Peer>>
  3. [一次用于浏览器选项卡]添加新对等体(具有null UserAuthorities并在一段时间后设置用户权限)
  4. [arrely]通过peerUid
  5. 删除UserAuthorities或所有同行的同行
  6. 最后在并发环境中实现上述所有四个陈述
  7. 问题:

    在我向地图添加新的Peer时,我已经发现了UserAuthorities。这意味着UserAuthorities是可变的。

    的问题:

    1. 有没有办法快速从Map<UserAuthorities, List<Peer>>获取Map<Long, Peer>? (对等体的近似数量约为20;但是每个用户请求都将执行该操作)
    2. 如果不是,如果Peer.userAuthorities是可变字段,我怎样才能实现呢?
    3. P.S: UserAuthorities更改后?

      答案非常简单 - 只有一次登录。用户进入主页,他在服务器端得到Peer,但尚未获得任何权限。所以他闯入并获得了他们。

2 个答案:

答案 0 :(得分: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:当添加对等体并且它具有null UserAuthority时,它是否应该包含在方法1返回的列表中?它应该包含在方法2返回的地图中吗?

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

关于更改UserAuthority:当用户权限更改时,是否可以通知此数据结构?也就是说,LoginDatastructure可以使用其他方法,例如

void userAuthorityWasSet(Peer peer);

当给定对等方的UserAuthority改变时将被调用?

关于第5点,并发性:有没有理由不公然制作所有这些方法synchronized


编辑:关于同步:您期望什么样的线程安全?例如,当添加一个Peer时,是否应该在某人可能从方法2的Map获得的所有列表中自动显示?在设置权限时是否还应更新这些列表?在任何情况下,到目前为止,这些方法主要是在数据结构中添加/删除元素,因此我认为使它们synchonrized不会产生任何可观的性能影响(当然,除非是数据结构,例如地图,在每次通话期间都是从头开始重建 - 但我想你无论如何都想避免这种情况。

无论如何,我觉得StackOverflow可能不适合进行这种讨论 ....

答案 1 :(得分:-1)

  1. 查看Map API:Map#values()
  2. 查看Map API:Map#remove()