【问题标题】:Remove Element in ArrayList in loop在循环中删除 ArrayList 中的元素
【发布时间】:2020-06-02 00:05:41
【问题描述】:

我需要帮助。我试图从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());
    }

但这不起作用。

【问题讨论】:

  • NumRangoini 的类型是什么?
  • 这个 SO 问题有帮助吗? How can I return the difference between two lists?
  • NumRangoini 是一个 BigInteger,BinInternacionalMarcaDEL 类有两个 bigInteger:NumRangoini 和 NumRangoFin,"IF" 有效,问题已移除
  • 能否在问题中添加 listDiff 和 ListOriginal 的声明
  • 您是否遇到不可修改的异常?

标签: java arraylist


【解决方案1】:

你只能做一件事

 listA.retainAll(listB);

现在在这里listA contains only similar elements in both ListA and ListB。

示例:

List<String> listA =  new ArrayList<>(Arrays.asList("12","13","15","2","5")) ;   
List<String> listB =  new ArrayList<> (Arrays.asList("2","12","48","49","55"));
listA .retainAll(listB );
System.out.println(listA ); //[12, 2]

【讨论】:

  • BinInternacionalMarcaDEL 类也应该实现equals 和hashCode。您的示例有效,因为 String 可以做到这一点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2023-03-16
    • 2013-02-24
    相关资源
    最近更新 更多