我必须只为ArrayList
添加唯一元素。如何为此目的覆盖equals
方法?我想要这样的东西:
public boolean equals (Object in) {
if(in == null) {
return false;
}
else if(in instanceof UniqueFruits) {
// ?? check whether the newly added element exists or not
return true;
}
else {
return false;
}
}
如何检查新添加的元素是否存在?我必须检查水果名称。
答案 0 :(得分:2)
听起来你想要使用Set
实现。如果订单无关紧要,请使用HashSet
。如果您想保留插入顺序,请使用LinkedHashSet
。或者,为了保持自然顺序,请使用TreeSet
。
在任何情况下,请确保覆盖元素对象的equals
方法。你拥有的是一个良好的开端。检查in instanceof UniqueFruits
后,将in
投放到UniqueFruits
:
UniqueFruits uf = (UniqueFruits)in;
然后,您可以依次使用equals
检查每个相关字段(如果某个字段可以为空,请务必首先检查null
)。任何现代IDE都可以帮助您自动生成equals
。首先尝试自己尝试,然后与生成的版本进行比较可能是有教育意义的。
确保同样覆盖hashCode
(IDE同样会帮助您解决此问题,并且有很多关于此事的在线阅读 - 只需搜索)。
如果您使用TreeSet
(或其他SortedSet
实施),您的元素对象应该实现Comparable
,否则您应该为SortedSet
提供{{3} }}
答案 1 :(得分:1)
我建议使用Set
代替ArrayList
来存储唯一元素。它更容易,更清洁。
根据Set
的{{3}},这就是它所说的内容:
不包含重复元素的集合。更正式的,集合 不包含元素e1和e2对,使得e1.equals(e2)和at 大多数一个null元素。正如其名称所暗示的,这个界面模型 数学集抽象
这是一个javadoc,讨论如何从ArrayList
中删除重复的元素。但是,您会注意到所提供的大多数解决方案都使用Set
的实现来实现您想要的功能。无论如何,如你所做的那样超越equals()
将无助于实现你的目标。 如果不是太麻烦(我不明白为什么你需要坚持ArrayList
给定你的实际要求,我会强烈建议搬到{{ 1}}实施。
答案 2 :(得分:0)
如果您的fruitname类有2个属性,例如fruitname
和fruitclass
,那么
您的支票代码应为
UniqueFruits current = (UniqueFruits) in;
if(this.fruitname.equals(current.fruitname) && this.fruitclass.equals(current.fruitclass)) {
return true;
}else{
return false;
}
进入哈希码会要求您的IDE生成UniqueFruits
类的hasdcode。
并使用Set
代替ArrayList
更轻松的说明您的IDE甚至可以为您生成equals()。