代码之家  ›  专栏  ›  技术社区  ›  Alex Blasco

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

  •  -1
  • Alex Blasco  · 技术社区  · 8 年前

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

    例如:

    列表1[“A”、“B”、“A”]和列表2[“A”、“B”] 必须返回等于。

    我使用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[“A”,“B”,“A”]和importedAreaPointsSET[“A”,“B”],我想返回true

    以下是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 回复  |  直到 8 年前
        1
  •  4
  •   DodgyCodeException    8 年前

    你的 equals 和 hashCode EPoint的定义不正确。你的 方法实际上是一种“近似等于”的方法,而您的 哈希代码

        2
  •  -1
  •   daniu    8 年前

    为什么不呢?

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

    ?

    编辑: 为什么不评论一下你为什么对这件事投反对票?