根据具有不同对象的匹配字段从数组列表中删除重复元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据具有不同对象的匹配字段从数组列表中删除重复元素相关的知识,希望对你有一定的参考价值。

我试图从两个对象的匹配字段中删除arraylist中的重复元素。我有两个列表

    List<SalesNotify> notifies=salesNotifyService.getAllNotify();

在这里,我从数据库中获取所有通知。第二个列表是

    List<Event> events = new ArrayList<Event>();
    events= salesNotifyService.getEventsFromGoogleCalendar();

在这里,我从谷歌日历API获取所有事件。

这里需要注意的一件事是从谷歌获取事件后,我正在迭代事件对象并将其设置为SalesNotify

    for (Event event : events) {  /* events obtained from second list.Here i am setting every event obtained from google to SalesNotify object fields */
                SalesNotify salesNotify = new SalesNotify();
                salesNotify.setEmployeeName(event.getSummary());
                String date = event.getStart().getDateTime().toString();
                String dateEnd = event.getEnd().getDateTime().toString();
                salesNotify.setNotifyDate(date);
                salesNotify.setNotifyEndDate(dateEnd);
                salesNotify.setNotifyType("other");
                salesNotify.setDumId(event.getId());
                allNotifies.add(salesNotify);
              }

我有第三个列表,我在这里添加这两个列表并发送它。这是第三个列表

    List<SalesNotify> allNotifies = new ArrayList<SalesNotify>(); 

我正在添加从这样的数据库中获取的SalesNotify列表

    for(SalesNotify notify : notifies){ /* notifies obtained from first list */
            allNotifies.add(notify);
        }

现在我要做的是我正在迭代SalesNotify列表和事件列表,并比较SalesNotify中的一个字段和事件列表中的一个字段,如下所示

    for(SalesNotify notify : notifies) {
      for(Event event : events) {
        if (notify.getShortNote().equals(event.getSummary())) { /*for example both have data "testing" */
            allNotifies.remove(event);
        }
      }
    }

我将通知和事件列表添加到allNotifies并将其返回到前端进行显示。但是这里allNotifies.remove(事件)不起作用。我能够输入if循环,但它不是从列表中删除事件。我想要如果满足条件,则从allNotifies列表中删除事件。我想保留SalesNotify对象数据。现在它显示两次。任何人都可以告诉如何执行此操作?

答案

如果使用for循环迭代List,它会在迭代期间锁定数组,并且在使用数组时不允许对数组进行任何修改。因此,如果使用for循环,则无法删除元素。如果您尝试从列表中删除元素,则会抛出ConcurrentModificationException。

相反,当迭代列表时,使用迭代器从列表中删除元素。它允许您删除元素而不会出现任何错误。

另一答案

所以你有一个类型的List,但想要根据另一个类的一些常见属性删除元素?如果是这样,您是否考虑使用地图?使用您想要用作键的属性(如果您有多个属性,我会建议使用MultiKey)然后只需删除该键?如果你有多个具有相同键的元素,那么你可能还想使用MultiValuedMap

以上是关于根据具有不同对象的匹配字段从数组列表中删除重复元素的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除重复的对象

删除内部字段数组 MongoDb 的元素 [重复]

如何通过匹配 ObjectId 字段从嵌套数组中删除对象

如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个

从列表中删除元素时出现 UnsupportedOperationException [重复]

根据JavaScript中的属性值从对象数组中选择[重复]