两个键映射到相同的值。爪哇

bw_dev

有什么解决方案可以避免在两个键映射到相同值的情况下避免使用两个映射?问题:我们有一台服务器,它接收两种类型的请求-getDataByUserID(UserID userId)getDataByNodeID(NodeID nodeId),其中userIdnodeId具有一对一的映射。没有使用DB,所有数据都存储在内存中。有一个简单的解决方案-使用两个映射oneUserID/data和second NodeID/data,但是我想避免对两个表进行操作。服务器接口是:

void put (InetSocketAddress nodeId, String clientId, Data data);
Data get (InetSocketAddress nodeId);
Data get (String clientId);

欢迎任何建议。

斯蒂芬·C

没有智能数据结构可以执行此操作。正如@JavaMan所建议的,HashMap如果键具有相同的超类型,则可以对两种类型的键都使用一个。但是,如果您需要并发解决方案,那么在没有竞争条件的情况下很难实现这一点。(您不能自动添加或删除两个条目...)

有一个讨厌的解决方案可以避免这种情况。您可以重新定义NodeIdandUserId类,以实现一个通用接口;CommonId然后,您需要重新定义equals(Object)hashCode()方法,以便它们将两种标识符视为等效。

例如:

UserId a = ...
NodeId b = ... // representing the same user as 'a'

然后

a.equals(b) => true
b.equals(a) => true
a.hashCode() == b.hashCode()

除了equals / hashcode合约的其他方面。

重要说明:假设存在一种有效的方法来实现上述语义,而该语义不依赖于我们定义的映射。

然后,您可以将地图更改为HashMap<CommonId, YourValueClass>putget使用UserId实例或NodeId实例作为键。

为什么这么讨厌?

  • 因为此重新定义equalshashCode适用于这两个类的所有用途,而不仅仅是此映射。

  • 因为它违反了记录的语义equals(Object)javadocs说this.equals(other) 应该返回falseifthisother具有不同的类。

但是,这确实建议了一些替代解决方案:

  1. 您可以使用TreeMap代替HashMap,并提供Comparator<CommonId>提供一致顺序的,并且将两种类型的等效标识符视为相等。

    • 尚不清楚实现该命令是否可行。
    • TreeMapO(logN)而非O(1)forgetput操作。
  2. 您可以尝试找到第3方哈希映射实现,该实现允许您提供哈希和等于函数。即类似于向aComparator提供TreeMap

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

合并两个映射并求和相同键的值的最佳方法?

检查 React 中的映射函数中的两个键是否具有相同的值

如何从两个映射中删除相同的键

将两个相同的表(相同的架构...)映射到Hibernate中的相同实体

PHP 在两个多维数组中查找相同的值并将它们映射到单独的数组中

映射为两个等效键返回不同的值

如何映射两个文件中的键和值?

使用Java流,将具有相同键但值不同的两个映射合并到元组?

在Java中合并具有相同键的两个映射,并将值加在一起

当相同的键时,将两个地图的值相加

Spring @CachePut用两个键放置相同的值

合并两个键不同但值相同的无序对象?

如何减去两个ints的defaultdicts的相同键的值

将具有重复列的表映射到相同类的两个实例

将两个相同的枚举映射到不同的名称空间

查询以获取映射到相同代码的两个不同项目的总和

创建将字典中的2个键映射到相同值的数据框列

从特定值开始,将数字映射到2的两个最接近的倍数

Haxe:将变量映射到两个值之一的效率

如何使用ID将两个CSV文件中的值映射到python中?

如何使用最新的 Javascript 合并两个对象,使一个对象的键映射到另一个对象的值,而第二个对象没有额外的键?

两个具有一个可选参数差异的URL映射到flask Restful中的相同资源

如何将两个长度相同的数组的键相互映射?

两个键,功能相同

加入两个相同的外键

EntityFramework:是否可以将两个不同的列映射到遵循相同实践的同一实体/模型?

如果两个键相同但值不同,谁能解释如何打印所有键?

如果JavaScript中的键相同,如何比较两个不同的Object键并更新其值?

将两个相同的值与相同的键组合在词典列表中