0

我必须只向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;
    }       
} 

如何检查新添加的元素是否存在?我必须检查水果名称。

4

3 回答 3

2

听起来你想使用一个Set实现。如果顺序无关紧要,只需使用HashSet. 如果要保留插入顺序,请使用LinkedHashSet. 或者,为了保持自然顺序,使用TreeSet.

在任何情况下,请确保覆盖您的元素对象的equals方法。你所拥有的是一个好的开始。检查后in instanceof UniqueFruitsin转换为UniqueFruits

UniqueFruits uf = (UniqueFruits)in;

然后,您可以依次检查每个相关字段equals(确保首先检查null字段是否可为空)。任何现代 IDE 都将帮助您equals自动生成。首先自己尝试一下,然后与生成的版本进行比较,这可能是有教育意义的。

确保也覆盖hashCode(IDE 将同样帮助您解决此问题,并且有大量关于此问题的在线阅读 - 只需搜索)。

如果你使用TreeSet(或其他一些SortedSet实现),你的元素对象应该要么实现,要么Comparable你应该提供SortedSet一个Comparator.

于 2012-08-09T04:08:15.523 回答
1

我建议使用Set而不是ArrayList存储独特的元素。它更容易,更清洁。

根据javadoc for Set,它是这样说的:

不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象

这是一篇关于如何从ArrayList. 但是,您会注意到提供的大多数解决方案都使用 的实现Set来实现您想要做的事情。在任何情况下,equals()你所做的压倒一切都无助于实现你的目标。如果不是太麻烦(我不明白为什么您需要坚持ArrayList给定的实际要求,我强烈建议您转向Set实现。

于 2012-08-09T04:07:44.847 回答
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;
}

并且来到 hashcode 要求您的 IDE 为UniqueFruitsClass 生成 hasdcode。并使用Set而不是ArrayList

稍微轻松一点,您的 IDE 甚至可以为您生成 equals()。

于 2012-08-09T04:09:53.183 回答