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个对等点;但该操作将根据每个用户请求进行)对等方
,但还没有获得任何权限。所以他登录并得到他们
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 mentgroupBy
。谢谢我认为“权威机构”的易变性在这里是一个关键点(这不是一个政治声明)。只要没有内置的通知机制,就无法向任何收集通知此领域的更改。因此,唯一的选择是“透明地”创建查询数据(与此字段相关)每次从头开始,您可能希望避免什么。您能否详细说明权限
字段是如何/何时修改的?或者是否存在一些可能的通知机制(例如接口PeerListener{void authorityChanged()}
可以添加哪些?回答关于#3的问题是:应该包括具有null
权限的对等方。更改用户权限的方法也在我的类中,我可以修改它。最后一个-对我来说,让所有方法同步对我来说似乎不是个好主意,因为我的应用程序基于非阻塞io(WebSocket)而且会有许多用户同时对同一个对等集合进行操作。@Volodymyr Bakhmatiuk添加了一个编辑,但认为很难在这里快速找到解决方案。。。
void userAuthorityWasSet(Peer peer);