【发布时间】:2013-12-03 11:26:20
【问题描述】:
我需要检查特定对象的等效实例是否在列表中。
对象是具有过于严格的 equals 方法的最终类的实例。我希望能够为“包含”方法提供equals 的不同实现,以检查对象是否包含在列表中。
如果partsInBox的元素顺序不同,下面类中的equals方法会返回false;我需要将这种行为更改为不分青红皂白的顺序。
public final class Box {
String category;
List<Integer> partsInBox;
@Override
public boolean equals(Object o) {
if (this == o) { return true; }
if (o == null || getClass() != o.getClass()) { return false; }
Box box = (Box) o;
return category.equals(box.category)
&& partsInBox.equals(box.partsInBox);
}
}
我希望能够做这样的事情:
List<Box> boxes; // list that I am checking
Box myBox; // what I am checking for
boolean contained = contatins(boxes, box, new EqualsMethod() {
@Override
public boolean areEqual(Box b1, Box b2) {
if (b1 == b2) { return true; }
return b1.category.equals(b2.category)
&& b1.partsInBox.containsAll(b2.partsInBox);
}
});
实现此类功能有哪些选择?
【问题讨论】:
-
@tintinmj 一点也不。代码审查站点用于寻求对有效代码的改进。在这里,迈克提出了一个关于如何做某事的问题。他需要... stackoverflow.com。
-
这样的
equals()实现(使用containsAll)会违反正确定义的equals()方法的对称 属性。 -
正确的是 areEqual() 是邪恶的。
-
@GriffeyDog Good Catch,可能需要
b1.containsAll(b2) && b2.containsAll(b1)
标签: java list collections contains