java - 在循环中删除 ArrayList 中的元素
问题描述
我需要帮助。我试图从ArrayList
. 我有两个清单。文件中的一个列表,数据库中的第二个列表。
我需要找到相同的元素,以便稍后从原始列表中删除它们,从而得到一个有差异的列表。
List<BinInternacionalMarcaDEL> listDiff = new ArrayList<BinInternacionalMarcaDEL>();
ListOriginal= binInternacionalRepositoryDEL.findAllByBin();
public List<BinInternacionalMarcaDEL> Differences(List<BinInternacionalMarcaDEL> listA,
List<BinInternacionalMarcaDEL> listB) {
try {
for(BinInternacionalMarcaDEL elementA: listaA){
for(BinInternacionalMarcaDEL elementB: listaB) {
if(elementA.getNumRangoini().compareTo(elementB.getNumRangoini()) == 0 ){
listDiff.add(elementA);
}
}
}
ListOriginal.removeAll(listDiff);
} catch (Exception e) {
LOGGER.error(e.toString());
}
但这不起作用。
解决方案
Java list remove 和 contains 方法是使用对象相等来实现的。此逻辑在您的类中的 hashCode 和 equal 方法中实现,Java 中的所有类都从 Object 类继承此属性。(老实说,ArrayList 在实现 remove 时不使用 hashCode 并包含方法,但在 java 合同中,您应该实现这两个方法一起)。在这里,当您将元素添加到 listDiff 时,您正在定义自己的相等性,它基于属性 numRangoini 的相等性(使用 compateTo 方法)以及当您请求列表类从列表中删除它们时(使用 removeAll 方法)。removeAll 根据这两个对象的相等性删除它们。由于您尚未在自己的类中定义此逻辑。此行为继承自基于严格相等的对象类。
解决方法:在自己的类中用equal方法定义相等的逻辑。如果两个对象具有相同的属性值 numRangoini,则此方法应返回 true。不要忘记定义 hashCode 为好。这是规则,如果两个对象相等,它们应该返回相同的 hashCode。
这是一个简单的实现
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null || obj.getClass()!= this.getClass())
return false;
BinInternacionalMarcaDEL binInternacionalMarcaDEL = (BinInternacionalMarcaDEL)obj;
return (national.getNumRangoini().compareTo(this.getNumRangoini()) == 0);
}
@Override
public int hashCode() {
return this.getNumRangoini().intValue();
}
推荐阅读
- php - 如果 cond 精确计数,如何制作?
- flutter - 为什么我的小部件上的参数传递为空?
- javascript - 在 axios 中使用异步等待
- python - 为什么另一个模型的上下文在模板中不起作用
- wagtail - 具有“全角”格式的图像未在 Wagtail 的 RichTextField 中居中?
- r - 学习 R:在 col-A 中查找值,在 Col-B 中列出唯一值,然后在 Col C 中列出相关值
- javascript - 找不到模块'../drop-file.js'量角器,角度
- swift - 出现错误:传递给不带参数的调用的参数
- swift - WebView 文件和相机 Feld 将我发送到 Web 应用程序的主页
- c++ - 当我调用他们的方法时,我的对象的成员发生了变化