【发布时间】:2013-02-05 00:55:11
【问题描述】:
我想组织一组Events,它们有一个独特的id 和一个time。我想在特定的时间范围内有效地查询Events。一些Events 可能具有相同的time 但不同的id。
一些Events 可能有相同的time,所以Guava TreeMultiSet 类非常接近我的需要。
但是,请考虑以下伪代码 sn-p:
class Event
{
Object id;
long time;
}
TreeMultiSet<Event> s = TreeMultiSet.create( new Comparator<Event>( )
{
@Override
public int compare( Event o1, Event o2 )
{
if ( o1.time < o2.time )
{
return -1;
}
else if ( o1.time > o2.time )
{
return 1;
}
else
{
return 0;
}
}
});
s.add( new Event( "a", 0 ) );
s.add( new Event( "b", 0 ) );
s.add( new Event( "c", 0 ) );
三个相加之后,TreeMultiSet 将只包含“a”Event 3 次,因为TreeMultiSet 只考虑Comparator,而三个Event 对象具有相同的time。
我的第一个想法是将id 合并为我的Comparator 实现的一部分,以区分Events 与相同的time,但我的ids 没有自然顺序(它们只是Objects并且不一定实现Comparable)。
这在进行subSet()、headSet() 等...查询时也会很尴尬——我不希望Event 对象的id 用于设置查询范围.
我可以从头开始实现一些自定义的东西(或者更有可能将繁重的工作委托给一些底层集合),但我想确保那里没有我遗漏的东西。
【问题讨论】:
标签: java collections guava