Remove duplicates ArrayList custom object
本问题已经有最佳答案,请猛点这里访问。
我有一个arraylist,它包含类
对于我的应用程序中的其他一些功能,我已经重写了equals函数(用于比较名称和时间戳)。
我怎么解决这个问题?
如果您已经有了自己的equals方法,则不能使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | List<Event> allEvents = // fill with your events. List<Event> noRepeat = new ArrayList<Event>(); for (Event event : allEvents) { boolean isFound = false; // check if the event name exists in noRepeat for (Event e : noRepeat) { if (e.getName().equals(event.getName()) || (e.equals(event))) { isFound = true; break; } } if (!isFound) noRepeat.add(event); } |
我认为您使用的数据结构错误。您希望使用
下面是我们测试它的方法:
因此,首先,我们创建一组要测试的事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Collection<Event> events = new ArrayList<Event>() { /** * */ private static final long serialVersionUID = 1L; { add(new Event("FirstCategory", new Timestamp(0))); add(new Event("FirstCategory", new Timestamp(0))); add(new Event("FirstCategory", new Timestamp(1))); add(new Event("SecondCategory", new Timestamp(2))); } }; |
现在,我们在一个名称和它对应的所有唯一事件之间创建一个映射:
现在,我们用每个名称的唯一事件填充映射:
1 2 3 4 5 6 7 8 9 10 11 | for (Event e : events) { if (!eventsByName.containsKey(e.getName())) { // create new set by name eventsByName.put(e.getName(), new HashSet<Event>()); } // add event to existing Set. // duplicates will be dropped since it's a `Set` eventsByName.get(e.getName()).add(e); } |
检查我们得到了什么:
1 |
输出:
1 2 3 4 5 6 7 8 9 |
提示1:
要获得名称列表,您只需查看
1 |
输出:
1 | [SecondCategory, FirstCategory] |
提示2:
如果这不是您所期望的,并且您想要一个不同的唯一性定义,那么您可以实现一个
所以如果你有一门课:
1 2 3 | class EventByRandomDefinitionComparator implements Comparator<Event>{ // implementation ... } |
这是填充映射时需要完成的全部工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // create different comparison mechanism Comparator<Event> comparator = new EventByRandomDefinitionComparator(); for (Event e : events) { if (!eventsByName.containsKey(e.getName())) { // create new set by name // changed Set implementation to use new comparator eventsByName.put(e.getName(), new TreeSet<Event>(comparator))); } // add event to existing Set. // duplicates will be dropped since it's a `Set` eventsByName.get(e.getName()).add(e); } |
祝你好运。
您应该在事件类中重写您的