Java集合中的独特元素

10

我有一个myObject的集合coll,我想只有当集合中没有这个元素时才向其中添加一个元素。

我已经重写了myObject类的equals方法。它检查其20个属性的相等性。

然而在集合的情况下,我希望仅基于其中一个属性进行相等性检查(并因此进行添加)。

也许我的架构存在缺陷,我不应该有两个equals定义,而应该有2个不同的对象。

但是,是否可能在不进行太多重构的情况下实现我的需求呢?也就是说,我想要某种Set集合,可以告诉它如何进行比较检查。这与Collection.sort()方法类似,您可以提供比较器来进行比较。


然后呢?我该如何使用这个比较器? - jbenz
1
看一下 SortedSet。也许那个适合你。 - Bhavik Shah
SortedSet可能会起作用。但是我会非常小心,因为你的比较器可能与equals和/或complete不一致。 - Thilo
4个回答

11

选择HashSet。它可以存储唯一值。正如这里的评论,您必须覆盖hashcode和equals方法以提供每个对象的唯一性。您可以在此处阅读这两种方法之间的关系。


你需要一个有效的 hashCode 和 equals 来实现这个(至少后者在这里并不适用)。 - Thilo
1
基于什么唯一?这是问题。当我实例化HashSet时,我能否提供一种方法来判断两个元素是否唯一呢? - jbenz
仅仅覆盖hashCode方法是不够的。你还需要equals方法(但OP不想使用它)。 - Thilo
不行,因为不使用equals方法是问题的重点(当然,这本身就是一个坏主意)。 - Thilo
@Thilo 我修改了使用equals方法,并在hashCode和equals方法之间建立了关联,你没有看到吗? - Android Killer
但是 OP 不想使用 equals。 - Thilo

2
您正在寻找一个 Set以及它的实现之一。

你需要一个不使用equals方法的解决方案。 - Thilo

2

你不能使用现有的容器来强制执行唯一性,因为它们都想使用equals

如果只有一个属性,你可以使用Map,将该属性作为键。这将允许每个属性值只有一个条目。

equalshashCode旨在与集合一起使用。你应该改变你的设计。也许将你现在拥有的equals(自己的)叫做其他名称。也许不要直接将这些东西放入集合中,而是包装成适配器。


我可以使用自己的集合吗?继承自set,并在其中重写负责相等性测试的方法吗? - jbenz

0
通过使用 TreeSet(Comparator comparator),您不需要依赖于“equals/hashCode”实现。
同样,如果您的集合是列表,您可以使用比较器 Collections.sort(List list, Comparator c) 对其进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接