我认为您使用的数据结构不正确。您需要使用Map
的实现,并将String
(名称)映射到Set<Event>
(唯一事件)。
以下是我们如何测试它:
- 创建一些事件。
- 创建
Map<String,Set<Event>
。这将允许我们将名称映射到唯一事件。
- 填充映射。
因此,首先我们创建了一个事件集合进行测试:
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)));
}
};
现在我们要创建一个名称和其对应的所有
唯一事件之间的映射:
Map<String, Set<Event>> eventsByName = new HashMap<String, Set<Event>>();
现在,我们为每个名称填充具有唯一事件的映射:
for (Event e : events) {
if (!eventsByName.containsKey(e.getName())) {
eventsByName.put(e.getName(), new HashSet<Event>());
}
eventsByName.get(e.getName()).add(e);
}
检查我们得到了什么:
System.out.println(eventsByName)
输出:
{
SecondCategory=[
Event [name=SecondCategory, timestamp=1970-01-01 02:00:00.002]
],
FirstCategory=[
Event [name=FirstCategory, timestamp=1970-01-01 02:00:00.0],
Event [name=FirstCategory, timestamp=1970-01-01 02:00:00.001]
]
}
提示1:
要获取名称列表,您只需要查看Map
的键,这些键实际上也是一个Set
:
System.out.println(eventsByName.keySet());
输出:
[SecondCategory, FirstCategory]
提示2:
如果这不是你所期望的,而你想要不同的唯一性定义,你可以实现一个Comparator<Event>
,并将其与TreeSet<Event>
一起使用,而不是使用无法接受自定义Comparator
的HashSet<Event>
。
因此,如果你有一个类:
class EventByRandomDefinitionComparator implements Comparator<Event>{
}
当填写映射时,只需要完成以下步骤:
Comparator<Event> comparator = new EventByRandomDefinitionComparator();
for (Event e : events) {
if (!eventsByName.containsKey(e.getName())) {
eventsByName.put(e.getName(), new TreeSet<Event>(comparator)));
}
eventsByName.get(e.getName()).add(e);
}
祝你好运。