4 回答

TA贡献1824条经验 获得超8个赞
if (!listCopy.contains(b)) {
是有问题的。
new Bean("数电", "75", "5")
和
new Bean("数电", "36", "5")
是不同的对象,所以contains返回false。
遍历listCopy,看看是否存在某个元素,它的第一个字段equals当前对象b的相应字段。
for(Bean b:list){
if ( ! isDuplicate(listCopy, b) ) {
listCopy.add(b);
}
}
boolean isDuplicate (ArrayList<Bean> list, Bean b) {
for (Bean elem : list) {
if (elem.getCourse().equals(b.getCourse()) return true;
}
return false;
}
还有一种方法:重写Bean的equals函数。
重写equals看起来很优雅,但是有个前提,即符合equals的语义。第一个字段相等就意味着两个Bean相等吗?这是值得商榷的。
equals方法具有很特殊的含义,需慎用。
从可读性的角度看,也是直接比较字段比较好。读者一眼就能看出你的意图。

TA贡献1811条经验 获得超4个赞
这是我的代码,运行通过:
重写equals(),getSubName是Bean的一个方法
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(this == obj){
return true;
}
if (obj == null) {
return false;
}
if(getClass() != obj.getClass()){
return false;
}
final Bean bean = (Bean)obj;
if (this.getSubName() != bean.getSubName()) {
return false;
}
return true;
}
ArrayList<Bean> listCopy = new ArrayList<Bean>();
for(Bean bean:list){
if (!listCopy.contains(bean)) {
listCopy.add(bean);
}
}
添加回答
举报