두 목록에 순서와 요소 수에 관계없이 동일한 개체가 있는지 비교하려고합니다.
예를 들면 :
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);
}
귀하 equals
와 hashCode
EPoint에 대한 정의가 올바르지 않습니다. 당신의 equals
당신의 동안 방법은 실제로 "거의 동일"방법입니다 hashCode
방법은 정확한 값을 사용합니다. 따라서 두 개의 EPoint 인스턴스가 동일하게 비교되지만 다른 hashCode를 가질 수 있습니다. 이것은 HashSet의 전제 조건을 깨뜨 리므로 그 이후에 원하는 방식으로 작동하는 것에 의존 할 수 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다