두 Java 목록에 순서 및 요소 수에 관계없이 동일한 객체가 포함되어 있는지 확인하십시오.

알렉스 블라스코

두 목록에 순서와 요소 수에 관계없이 동일한 개체가 있는지 비교하려고합니다.

예를 들면 :

List1 [ "A", "B", "A"] 및 List2 [ "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);
}
DodgyCodeException

귀하 equalshashCodeEPoint에 대한 정의가 올바르지 않습니다. 당신의 equals당신의 동안 방법은 실제로 "거의 동일"방법입니다 hashCode방법은 정확한 값을 사용합니다. 따라서 두 개의 EPoint 인스턴스가 동일하게 비교되지만 다른 hashCode를 가질 수 있습니다. 이것은 HashSet의 전제 조건을 깨뜨 리므로 그 이후에 원하는 방식으로 작동하는 것에 의존 할 수 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관