我试图比较两个列表是否具有相同的对象,与其顺序和元素数量无关。
例如:
List1 [" A"," B"," A"]和List2 [" A"," B&# 34] 必须返回等于。
我正在使用Set,因为检查独立于对象的顺序。但是,如果两个列表具有不同数量的元素,则返回false。
这是我的代码:
private Optional<EArea> getSimilarExistingArea(EImportArea importedArea) {
for (EArea existingArea : baseLineService.getBaseLine().getAreas()) {
EList<EPoint> importedAreaPoints = importedArea.getPoly().getPoints();
EList<EPoint> existingAreaPoints = existingArea.getPoly().getPoints();
final Set<EPoint> importedAreaPointsSET = new HashSet<>(importedAreaPoints);
final Set<EPoint> existingAreaPointsSET = new HashSet<>(existingAreaPoints);
if (existingAreaPointsSET.equals(importedAreaPointsSET)) return Optional.of(existingArea);
}
return Optional.empty();
}
如果existingAreaPointsSET [&#34; A&#34;,&#34; B&#34;,&#34; A&#34;]和importAreaPointsSET [&#34; A&#34; ,&#34; B&#34;]
以下是EPoint类中的equals和hashCode函数:
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof EPoint)) {
return false;
}
EPoint ePoint = (EPoint) o;
return Math.abs(Math.abs(ePoint.lat) - Math.abs(lat)) < EPSILON && Math.abs(Math.abs(ePoint.lon) - Math.abs(lon)) < EPSILON;
}
@Override
public int hashCode() {
return Objects.hash(lat, lon);
}
答案 0 :(得分:3)
您对EPoint的equals
和hashCode
定义不正确。您的equals
方法实际上是“近似等于”方法,而您的hashCode
方法使用的是精确值。因此,两个EPoint实例可以比较相等但具有不同的hashCodes。这打破了HashSet的前提条件,因此你不能依赖它在你之后的行为方式。
答案 1 :(得分:-1)
为什么不
list1.containsAll(list2) && list2.containsAll(list1);
编辑: 为什么不评论你为什么要贬低这个?