Java 快速表示地图的方法<;K、 V>;作为地图<;U、 列表<;V>&燃气轮机;

Java 快速表示地图的方法<;K、 V>;作为地图<;U、 列表<;V>&燃气轮机;,java,collections,map,concurrency,Java,Collections,Map,Concurrency,我有:Map,其中键是peerUid,value是Peer。每个Peer类似于用户会话容器,包含UserAuthorities: public class Peer { private UserAuthorities authorities; //... } 我需要: 快速执行以下操作: [一半请求中]获取所有对等方:列表 [在每个请求中]按UserAuthorities:Map对所有对等方进行分组 [一次用于浏览器选项卡]添加新对等方(用户权限为空,一段时间后设置用户权限) [延迟]

我有:
Map
,其中键是
peerUid
value
Peer
。每个
Peer
类似于用户会话容器,包含
UserAuthorities

public class Peer {
  private UserAuthorities authorities;
  //...
}
我需要:

快速执行以下操作:

  • [一半请求中]获取所有对等方:
    列表
  • [在每个请求中]按
    UserAuthorities
    Map
    对所有对等方进行分组
  • [一次用于浏览器选项卡]添加新对等方(用户权限为空,一段时间后设置用户权限)
  • [延迟]通过
    peerUid删除对等方
    或通过
    UserAuthorities删除所有对等方
  • 最后在并发环境中实现上述四个语句
  • 问题:

    当我向地图添加新的
    Peer
    时,我还没有
    UserAuthorities
    。这意味着
    UserAuthorities
    是可嘀咕的

    问题:

  • 有没有办法从
    Map
    快速获取
    Map
    ?(大约有20个对等点;但该操作将根据每个用户请求进行)
  • 如果否,如果Peer.userAuthorities是可变字段,如何实现这一点
  • p.S:用户权限何时更改

    答案很简单——只需登录一次。用户进入主页,他在服务器端获得了
    对等方
    ,但还没有获得任何权限。所以他登录并得到他们

  • 检查
    Map
    API:
    Map#values()
  • ?
  • 检查
    Map
    API:
    Map#remove()
  • ?
  • ?

  • 这不是一个答案,所以从技术上讲,它可能必须被删除-但类似的事情很难在评论中讨论…:

    因此,我假设数据结构应该类似于此接口
    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);
    }
    
    ?

    关于更改用户权限:当用户权限更改时,是否可以通知此数据结构?也就是说,
    LoginDatastructure
    是否可以有一个附加方法,如

    void userAuthorityWasSet(Peer peer);
    
    当给定对等方的UserAuthority发生更改时将调用的

    关于第5点,并发性:是否有任何理由不公开地使所有这些方法同步


    编辑:关于同步:你期望什么样的线程安全?例如,当添加一个对等点时,该对等点是否应自动在有人可能从方法2的映射中获得的所有列表中可见?在设置权限时,这些列表是否也应更新?在任何情况下,到目前为止,这些方法主要是在数据结构中添加/删除元素,因此我认为将它们
    同步化
    不会对性能产生太大影响(当然,除非数据结构(如地图)是在每次调用期间从头开始重建的,但我认为您无论如何都希望避免这种情况


    无论如何,我觉得StackOverflow可能不是进行此类讨论的合适场所……

    我熟悉map API。
    map@values()
    返回列表。要按UserDetails参数对列表排序,我应该遍历所有列表O(n)并执行O(n)
    等于
    调用。这很慢,如果这能显著提高您的速度,您可以保留另一个按某个参数排序的映射值视图,并以具体值作为后盾。您的意思是按
    用户权限进行分组吗?@RohitJain是API方法吗?不是。只是询问。您说了排序,但这看起来更像分组。@RohitJa在yes,I ment
    groupBy
    。谢谢我认为“权威机构”的易变性在这里是一个关键点(这不是一个政治声明)。只要没有内置的通知机制,就无法向任何收集通知此领域的更改。因此,唯一的选择是“透明地”创建查询数据(与此字段相关)每次从头开始,您可能希望避免什么。您能否详细说明
    权限
    字段是如何/何时修改的?或者是否存在一些可能的通知机制(例如
    接口PeerListener{void authorityChanged()}
    可以添加哪些?回答关于#3的问题是:应该包括具有
    null
    权限的对等方。更改用户权限的方法也在我的类中,我可以修改它。最后一个-对我来说,让所有方法
    同步对我来说似乎不是个好主意,因为我的应用程序基于非阻塞io(WebSocket)而且会有许多用户同时对同一个对等集合进行操作。@Volodymyr Bakhmatiuk添加了一个编辑,但认为很难在这里快速找到解决方案。。。
    
    void userAuthorityWasSet(Peer peer);