我正在尝试根据两个对象的匹配字段从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对象数据。现在它显示两次。谁能告诉你怎么做?
答案 0 :(得分:0)
如果使用for循环迭代List,它会在迭代期间锁定数组,并且在使用数组时不允许对数组进行任何修改。因此,如果使用for循环,则无法删除元素。如果您尝试从列表中删除元素,则会抛出ConcurrentModificationException。
相反,迭代列表时,使用迭代器从列表中删除元素。它允许您删除元素而不会出现任何错误。
答案 1 :(得分:0)
所以你有一个类型的List,但是想根据另一个类的一些常见属性删除这些元素?如果是这样,您是否考虑使用地图?使用您想要用作键的属性(如果您有多个属性,我会建议MultiKey)然后只删除该键?如果您有多个具有相同密钥的元素,那么您可能还想使用MultiValuedMap。