检查两个 List<E> 是否有一些共同的元素

Check if two List<E> have some single common element

我正在尝试检查两个列表是否有某个共同元素。我尝试了不同的方法,但它总是 return 错误。到目前为止,我正在使用方法 contains(Object):

private void setImportedAreaParameters(EList<EArea> exitingAreas) {
    EList<EPoint> importedAreaPoints = importedArea.getPoly().getPoints();
    for (EArea existingArea : exitingAreas){
        EList<EPoint> existingAreaPoints = existingArea.getPoly().getPoints();
        if(importedAreaPoints.contains(existingAreaPoints)){
            importedArea.setImportChoice(EImportAreaChoiceEnum.REPLACE);
        }
        else if (importedAreaPoints.size() >= POLYGON_POINTS_MAX_VALUE){
            importedArea.setImportChoice(EImportAreaChoiceEnum.TO_MANY_POINT);
        }
    }
}

EList importedAreaPoints 和 existingAreaPoints 具有完全相同的元素。

importedAreaPoints [com.samu.domain.EPoint@45f5fd38 (lat: -5.580874037404866, lon: 35.94777225005756), com.samu.domain.EPoint@3dd4c25c (lat: -5.286985080169555, lon: 35.97486383222591), com.samu.domain.EPoint@18a80682 (lat: -5.286985080169555, lon: 35.71115171259456), com.samu.domain.EPoint@6c992dd3 (lat: -5.573099299909384, lon: 35.68508505352236), com.samu.domain.EPoint@6ef0145 (lat: -5.580874037404866, lon: 35.94777225005756)]

现有区域点 [com.samu.domain.EPoint@2d5caf46 (lat: -5.580874037404866, lon: 35.94777225005756), com.samu.domain.EPoint@2163354d (lat: -5.286985080169555, lon: 35.97486383222591), com.samu.domain.EPoint@2dd124cc (lat: -5.286985080169555, lon: 35.71115171259456), com.samu.domain.EPoint@66e5987d (lat: -5.573099299909384, lon: 35.68508505352236), com.samu.domain.EPoint@2e8b3d78 (lat: -5.580874037404866, lon: 35.94777225005756)]

EList 扩展自 java.util.List

你有:

if(importedAreaPoints.contains(existingAreaPoints))

你应该

if(importedAreaPoints.contains(existingArea))

第一个是检查它是否包含列表对象而不是元素。

要检查的另一件事是 .equals(Object 0) 方法,以确保逻辑正确。

您应该覆盖 EPoint class 的 equals 和 hashCode,现在您正在检查对象是否相同。和对象不一样,你可以在对象@6ef0145的地址上看到它 -> 都是不同的

https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

(对不起德语 link) http://www.tutego.de/javabuch/Java-ist-auch-eine-Insel/10/javainsel_08_003.html#dodtp848b6b5d-0c2d-464d-ac8e-4c765d194c9e

你应该比较long和lat是否相同

如果你只是想检查是否存在公共元素,那么你可以使用retainAll(Collection<?> c)方法。考虑到 listAlphalistBeta 是两个 List<E>

List<T> commonItems = new ArrayList<>(listAlpha);
commonItems.retainAll(listBeta);

现在 commonItems 仅包含 listAplhalistBeta 共有的项目。

查找共同元素的过程基于两个或多个元素的比较。如果您定义了自己的类型(EArea、EPoint),您必须关心 equals 和 hashCode 方法,因为这是您编写对象通用性逻辑的地方(更多信息:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-).当您覆盖这些方法时,您可以应用集合框架提供的任何操作或实施您自己的解决方案。