首页 > 解决方案 > 在循环中删除 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());
    }

但这不起作用。

标签: javaarraylist

解决方案


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(); 
}

推荐阅读