【问题标题】:Check if two List<E> have some single common element检查两个 List<E> 是否有一些单一的公共元素
【发布时间】:2018-04-03 19:22:40
【问题描述】:

我正在尝试检查两个列表是否有一些共同的元素。我尝试了不同的方法,但它总是返回错误。现在我正在使用方法 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 importAreaPoints 和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)]

existingAreaPoints [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(!Collections.disjoint(list1, list2)){//if one or more elements are matched} else {//No elements in common}
  • 这也返回 false。我只想检查是否有一个共同的元素,我不想检查两个列表是否包含完全相同的元素。
  • 我已经尝试过使用(!Collections.disjoint(list1, list2) 并返回false。
  • 这不会检查完全相同的元素,但会检查至少一个共同元素。检查列表的值它们包含的内容。
  • 这个方法也可以查看:if (!new HashSet&lt;T&gt;(list1).retainAll(list2).isEmpty()) {// at least one element is in common}

标签: java list contains


【解决方案1】:

你有:

if(importedAreaPoints.contains(existingAreaPoints))

你应该有

if(importedAreaPoints.contains(existingArea))

首先是检查它是否包含列表对象而不是元素。

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

【讨论】:

  • 这是否完全解决了问题?如果是这样,我不会投反对票。但是,在这种情况下,问题可能应该由于不太可能帮助他人的简单错误而关闭。
  • 我也没有投反对票,真的人们在投反对票时应该发表评论。
  • 我正在尝试使用我收到的所有信息找到解决方案。之后我会投票给你的答案。谢谢。
  • 在我看来,好像您正在尝试为另一个列表中存在的每个元素设置一个值。在这种情况下,我所说的是正确的,containsAll 不起作用,Collections.disjoint 也不起作用。
【解决方案2】:

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

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

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

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

【讨论】:

  • 非常感谢。正是这样。当我在自己的 EPoint java 类中覆盖 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)) &lt; EPSILON &amp;&amp; Math.abs(Math.abs(ePoint.lon) - Math.abs(lon)) &lt; EPSILON; } @Override public int hashCode() { return Objects.hash(lat, lon); }
【解决方案3】:

如果你只是想检查共同元素的存在,那么你可以使用retainAll(Collection&lt;?&gt; c) 方法。考虑到listAlphalistBeta 是两个List&lt;E&gt;

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 非常感谢。正是这样。当我在自己的 EPoint java 类中覆盖 equals 和 hashCode 方法时,我解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2017-08-08
    相关资源
    最近更新 更多