检查两个java列表是否包含相同的对象,与元素的顺序和数量无关

时间:2017-10-30 11:00:35

标签: java set

我试图比较两个列表是否具有相同的对象,与其顺序和元素数量无关。

例如:

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);
}

2 个答案:

答案 0 :(得分:3)

您对EPoint的equalshashCode定义不正确。您的equals方法实际上是“近似等于”方法,而您的hashCode方法使用的是精确值。因此,两个EPoint实例可以比较相等但具有不同的hashCodes。这打破了HashSet的前提条件,因此你不能依赖它在你之后的行为方式。

答案 1 :(得分:-1)

为什么不

list1.containsAll(list2) && list2.containsAll(list1);

编辑: 为什么不评论你为什么要贬低这个?