Java集合确保唯一性,同时提供参考
我有这样的结构:Java集合确保唯一性,同时提供参考
public class Foo
{
public int A ;
public int B ;
public int C ;
}
我需要把这些在我结束了不超过这样的方式添加到集合中一个接一个一份A,B和C都相等的副本。我还需要将对象的引用了另一个类,如下所示:
public class Bar
{
public Foo A ;
public Foo B ;
public Foo C ;
}
我使用TreeSet <Foo>
,它努力确保其唯一性试过,但我不能得到一个参考背出一个TreeSet(只是否一个布尔值或者不是/是在集合中),所以我无法将该参考传递给Bar
。我尝试使用TreeMap < Foo , Integer >
以及ArrayList <Foo>
,这样做的目的是确保唯一性并使我能够获取对象的引用,但这会浪费大量时间和内存来维护ArrayList
和Integer
。
我需要一种说法“如果这个Foo
还没有在集合中,请添加它;否则,请将集合中已有的Foo
已经存在,而不是我创建的集合中检查它的存在。 。
(我刚想到我可以做一些像TreeMap < Foo , Foo >
这样的事情,而且会做我想做的事情,但它仍然看起来像是浪费,即使它远远不及一个,所以我会继续这个问题在启蒙的希望)
(是的,我也实现Comparable
做在树上唯一性检查;这部分工作已经)
为了确保在Set
独特性,你需要重写equals()
和hashcode()
,以便具有相同A,B,C的Foo的两个实例是.equals()
。
理想的情况下,任何你放在一个集应该是一成不变的(即你的三个整数应final
从documentation:。
如果使用可变对象作为设定 元素大,一定要小心的如果 对象的值以影响equals比较而 的对象是在该组的元素的方式变化没有被指定的一组行为。
不幸的是,Set
没有提供任何方法让您获取实际实例 - 您需要使用Map
或另一个集合,因为您已经尝试过。
更新另一种方法是创建基于JDK source code TreeSet中的自己的修改版本添加一个方法来获取你需要的实例(扩展标准TreeSet的不会做你所需要的,因为相关领域是private
,除非您使用反射来访问它们)。
由尼尔·科菲在Sorted collection in Java一个解决方案给了我所需要的,这是使用ArrayList <Foo>
始终做Collections . binarySearch
获得或者已经在列表中的元素的索引,或者该元素应该被插入到列表中的点。
这样在O(log n)时间像树一样维护一个不断排序的列表,但允许同时检索现有实例。不幸的是,它有O(n)个插入时间,但在这种情况下这不是世界的尽头,尽管它仍然不是最理想的。
为什么你需要它是完全相同的实例?这听起来像是一个危险的想法。但是你可能很容易用你需要的方法扩展'TreeSet'。 – biziclop
所以我添加到'Foo'中的任何其他内容都不会影响唯一性(元数据,基本上)将保留在'Bar'中。 – JAKJ
那么'TreeMap'有什么问题呢? –
biziclop