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

时间:2018-03-04 12:35:14

标签: java arraylist

我正在尝试根据两个对象的匹配字段从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对象数据。现在它显示两次。谁能告诉你怎么做?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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