2012-08-09 33 views
0

我必须添加唯一元素到ArrayList。我怎样才能为此覆盖equals方法?我想是这样的:如何使用equals()创建独特元素的ArrayList

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

为了做到这一点,你必须重写'equals'和'hashCode'方法。 – 2012-08-09 04:00:24

+0

但是如何?我需要检查部分的代码。 – 2012-08-09 04:02:28

+0

您必须比较里面的属性值,你的'如果(在的instanceof UniqueFruits){...}'代码返回true或false,这取决于你的规则,像水果的名字或任何你想/需要 – 2012-08-09 04:03:33

回答

2

这听起来像你想使用Set实现。如果顺序并不重要,只要使用HashSet。如果你想保留插入顺序,使用LinkedHashSet。或者,保持自然排序,使用TreeSet

在任何情况下,请务必覆盖你的元素对象的方法equals。你有什么是一个好开始。 NG in instanceof UniqueFruits,投inUniqueFruits

UniqueFruits uf = (UniqueFruits)in; 

就可以检查使用equals各相关领域依次(请务必检查null第一个字段为空)。任何现代IDE将帮助您自动生成equals。先尝试一下,然后再与生成的版本进行比较可能会有教育意义。

确保也覆盖hashCode(IDEs将同样帮助您解决这个问题,并且网上有大量关于此事的文章 - 只是搜索)。

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

+0

+1表示“使用集合,而不是列表”。 – 2012-08-09 11:39:42

1

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

按照该javadocSet,这里就是这样说的:

不包含重复元素的集合。更正式地说,集合 不包含元素对e1和e2,使得e1.equals(e2)和 中最多一个为null元素。正如其名称所暗示,此接口的型号 的数学集合抽象

这里是一个SO article谈到有关如何从ArrayList删除重复的元素。但是,您会注意到提供的大多数解决方案都使用了Set的实现来实现您想要执行的操作。在任何情况下,如您所做的那样重覆equals()将无助于实现您的目标。 如果不是太麻烦的(我不明白为什么你需要一个ArrayList坚持以你的实际需要,我会强烈建议移动到Set实现。

+0

我知道设置可以帮助更好,但我只需要一个ArrayList。 – 2012-08-09 04:08:53

+0

@NihalSharma为什么? – 2012-08-09 04:10:36

+0

我有一个测试,他们要求。我无法解决它。 – 2012-08-09 04:23:50

0

如果您fruitname类有2个属性,如fruitnamefruitclass然后

你的校验码应该是

UniqueFruits current = (UniqueFruits) in; 
if(this.fruitname.equals(current.fruitname) && this.fruitclass.equals(current.fruitclass)) { 
    return true; 
}else{ 
    return false; 
} 

和未来的hashCode时问你的IDE生成hasdcode为UniqueFruits类。 并使用Set,而不是ArrayList

开句玩笑了您的IDE甚至可以生成equals()方法适合你。