2013-04-15 142 views
8

我有一个Collection myObject的集合。我只想在集合中没有这样的元素的情况下添加一个元素。java独特元素集合

我已经覆盖了myObject的equals方法。它检查它的20个属性的相等性。

但是在收集的情况下,我想提出仅基于这些属性中的一个平等检查(并因此添加)。

也许我的架构是有缺陷的,我不应该有平等的两个定义,而是应该有2个不同的对象。

但是,没有太多的重构,是否有可能从这里实现我想要的?也就是说,我想要某种Set集合,在那里我可以告诉如何进行比较检查。这与Collection.sort()方法类似,您可以在其中提供比较器以检查比较结果。

+0

然后呢?我如何使用这个比较器? – jbenz

+1

看看SortedSet。也许这会对你有用 –

+0

SortedSet可能工作。不过,我会非常小心,因为你的比较器不会与等于和/或完全一致。 – Thilo

回答

8

HashSet它将存储唯一值。从这里的评论,你必须重写哈希码和等于提供每个对象的唯一性的方法。您可以阅读这两种方法之间的关系here

+0

你需要工作hashCode和等于(至少后者不是这里的情况)。 – Thilo

+1

基于什么独特?这就是问题所在。当我实例化哈希集时,我可以提供一种方法来判断两个元素是否唯一? – jbenz

+0

@jbenz编辑后有意义吗? –

2

你正在寻找一个Set及其实现方式之一。

+0

你会需要一个不使用'equals'的。 – Thilo

2

不能使用现有的容器来实施唯一在这里,因为他们都希望使用equals

如果它只有一个属性,则可以使用Map,并将该属性作为关键字。 这将只允许该属性的每个值有一个条目。

equalshashCode旨在与类别使用。你应该改变你的设计。也许称自己的平等(你现在拥有的那个)别的东西。也许不要直接将这些东西放到集合中,而是包装到某种适配器中。

+0

我可以使用我自己的集合,从set继承,我重写负责平等测试的方法? – jbenz

+0

是的,你可以。 – Thilo

0

通过使用一个TreeSet(比较比较)你不需要依靠“等于/的hashCode”执行。类似地,如果你的集合是一个列表,你可以使用比较器Collections.sort(List list,Comparator c)对它进行排序;