Java:设置集合,其中项目由其类别标识
我需要 Set 集合,其中的项目将由项目类标识。类似于 Appache 的 ReferenceIdentityMap
集合,但在类范围内,即同一类的两个不同实例必须在此集合中标识为相同。
你知道,这违反了 equals()/hashCode() 身份原则,但在偶尔使用时这是有道理的。
我已经用 Map
,但由于简单,它没有实现 Set
。可能有一个更优雅的解决方案,任何 Set
的装饰器都会很棒。
是否有此类集合的实现(Apache/Google/something/... Collections)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您希望覆盖集合成员的 equals() / hashCode() 的含义。我想,最简洁的方法是使用包装类:
然后您将创建一个
Set>
。You wish to override the meaning of equals() / hashCode() for your set members. The cleanest way to do this, I imagine, is to use a wrapper class:
You would create a
Set<Wrapper<E>>
then.如何扩展
HashSet
并仅重写add(..)
方法,将object.getClass()
而不是对象本身放入内部设置<类>
,如果成功,则添加项目本身。像这样的东西How about extending
HashSet
and overriding just theadd(..)
method, puttingobject.getClass()
instead of the object itself in an innerSet<Class<? extends E>>
, and if it succeeds, adding the item itself. Something like您可以创建一个 Comparator 类并根据它构建您的集合。您不能违反的唯一条件是,对于您尝试添加的每两个元素,compare(e1, e2) 不应抛出 ClassCastException - 这意味着您尝试插入的每两个成员应该是可比较的。
比较器类本身应该只查看对象的类,因此它是安全的。
查看构造函数
You can create a Comparator class and construct your set with it in mind. The only condition you must not violate is that for every two elements you try to add, compare(e1, e2) should not throw a ClassCastException - which means that every two members you would try to insert should be comparable.
The comparator class itself should look only at the objects' classes, so it will be safe.
Check out the constructor here.