我正在尝试检查两个列表是否有一些共同的元素。我尝试了不同的方法,但它总是返回假。到现在我正在使用方法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)]
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扩展
答案 0 :(得分:2)
你应该覆盖你的EPoint类的equals和hashCode,现在你正在为对象是相同的而加油。并且对象不一样,你可以在对象的地址上看到它@ 6ef0145 - &gt;这些都是不同的
https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/
你应该比较long和lat是否相同
答案 1 :(得分:2)
寻找共同元素的过程基于两个或多个元素的比较。如果您定义了自己的类型(EArea,EPoint),则必须关注的equals和hashCode方法,因为这是您编写对象通用性逻辑的地方(更多信息:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-) 。当您覆盖这些方法时,您可以应用Collections框架提供的任何操作或实现您自己的解决方案。
答案 2 :(得分:0)
if(importedAreaPoints.contains(existingAreaPoints))
你应该
if(importedAreaPoints.contains(existingArea))
第一个是检查它是否包含列表objec而不是元素。
要检查的另一件事是.equals(Object 0)
方法,以确保逻辑正确。
答案 3 :(得分:0)
如果您只是想检查公共元素是否存在,那么您可以使用retainAll(Collection<?> c)
方法。考虑listAlpha
和listBeta
是两个List<E>
List<T> commonItems = new ArrayList<>(listAlpha);
commonItems.retainAll(listBeta);
现在commonItems
仅包含listAplha
和listBeta
共有的项目。