检查两个 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/
你应该比较long和lat是否相同
如果你只是想检查是否存在公共元素,那么你可以使用retainAll(Collection<?> c)
方法。考虑到 listAlpha
和 listBeta
是两个 List<E>
List<T> commonItems = new ArrayList<>(listAlpha);
commonItems.retainAll(listBeta);
现在 commonItems
仅包含 listAplha
和 listBeta
共有的项目。
查找共同元素的过程基于两个或多个元素的比较。如果您定义了自己的类型(EArea、EPoint),您必须关心 equals 和 hashCode 方法,因为这是您编写对象通用性逻辑的地方(更多信息:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-).当您覆盖这些方法时,您可以应用集合框架提供的任何操作或实施您自己的解决方案。
我正在尝试检查两个列表是否有某个共同元素。我尝试了不同的方法,但它总是 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/
你应该比较long和lat是否相同
如果你只是想检查是否存在公共元素,那么你可以使用retainAll(Collection<?> c)
方法。考虑到 listAlpha
和 listBeta
是两个 List<E>
List<T> commonItems = new ArrayList<>(listAlpha);
commonItems.retainAll(listBeta);
现在 commonItems
仅包含 listAplha
和 listBeta
共有的项目。
查找共同元素的过程基于两个或多个元素的比较。如果您定义了自己的类型(EArea、EPoint),您必须关心 equals 和 hashCode 方法,因为这是您编写对象通用性逻辑的地方(更多信息:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-).当您覆盖这些方法时,您可以应用集合框架提供的任何操作或实施您自己的解决方案。