如何使用equals()创建唯一元素的ArrayList

时间:2012-08-09 03:59:07

标签: java list arraylist

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

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

3 个答案:

答案 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个属性,例如fruitnamefruitclass,那么

您的支票代码应为

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()。