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

问题描述 投票:0回答:2

我试图从两个对象的匹配字段中删除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对象数据。现在它显示两次。任何人都可以告诉如何执行此操作?

java arraylist
2个回答
0
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.