我不确定在地图中使用动态对象(如集合作为键)的主流观点是什么.
我知道典型的Map实现(例如,HashMap)使用哈希码来决定将条目放入哪个桶,并且如果该哈希码应该以某种方式改变(可能因为Set的内容应该改变,那么那可能会弄乱)通过导致错误地计算存储桶来启动HashMap(与Set最初插入HashMap的方式相比).
但是,如果我确保Set内容根本没有变化,那么这是否可行?即便如此,这种方法通常被认为是容易出错的,因为集合具有固有的易变性(即使采取了预防措施以确保它们不被修改)?
看起来Java允许将函数参数指定为final; 这可能是一个可以采取的一个小小的预防措施?
人们甚至在商业/开源实践中做这样的事情吗?(将List,Set,Map等作为键放在地图中?)
我想我应该用这个来描述我想要完成的事情,这样动机就会变得更加清晰,也许可以提出其他实施方案.
我想要完成的是拥有这样的东西:
class TaggedMap<T, V> {
Map<Set<T>, V> _map;
Map<T, Set<Set<T>>> _keys;
}
Run Code Online (Sandbox Code Playgroud)
......本质上,能够用某些键(T)"标记"某些数据(V)并写入其他辅助功能来访问/修改数据并用它做其他奇特的东西(即返回所有条目的列表)满足一些关键标准)._keys的功能是作为一种索引,以便于查找值而无需遍历所有_map的条目.
在我的情况下,我打算专门使用T = String,V = Integer.我与之交谈的人建议用字符串代替Set,即:
class TaggedMap<V> {
Map<String, V> _map;
Map<T, Set<String>> _keys;
}
Run Code Online (Sandbox Code Playgroud)
其中_map中的键的类型为"key1; key2; key3",其中键由分隔符分隔.但我想知道我是否可以完成一个更通用的版本,而不是必须在键之间强制使用带分隔符的String.
我想知道的另一件事是,是否有某种方法可以将其作为Map扩展.我想象的是:
class TaggedMap<Set<T>, V> implements Map<Set<T>, V> {
Map<Set<T>, V> _map;
Map<T, Set<Set<T>>> _keys;
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法将其编译,可能是由于我对泛型的理解较差.以此作为目标,任何人都可以修复上述声明,以便它根据我所描述的精神工作或建议一些轻微的结构修改?特别是,我想知道"implements Map,V>"子句,是否可以声明这样一个复杂的接口实现.
如果你确定的话,你是对的
Set内容没有改变,和Setš本身不会被修改将它们用作钥匙是完全安全的Map.
很难确保(1)不会意外违反.一种选择可能是专门设计存储在Set其中的类,以便该类的所有实例都是不可变的.这可以防止任何人意外更改其中一个Set键,因此(1)是不可能的.例如,如果您使用a Set<String>作为键,则无需担心由于外部修改而导致更改String内部的s Set.
您可以使用该Collections.unmodifiableSet方法轻松地使(2)成为可能,该方法返回Set无法修改的包装视图.这可以对任何人进行Set,这意味着对你的密钥使用这样的东西可能是一个非常好的主意.
希望这可以帮助!如果您的用户名意味着我的想法,那么学习每种语言都会好运!:-)
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |