我想组织一组Events
,其中包含唯一的id
和time
。我想在特定的时间范围内有效地查询Events
。某些Events
可能具有相同的time
但不同的id
。
某些Events
可能具有相同的time
,因此Guava TreeMultiSet
类非常接近我的需要。
但是,请考虑以下psudo-code代码段:
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
将只包含&#34; a&#34; Event
3次,因为TreeMultiSet
仅考虑Comparator
且三个Event
对象具有相同的time
。
我的第一个想法是将id
作为我的Comparator
实施的一部分,以区分Events
与time
相同,但我的ids
没有自然排序(他们只是Objects
并且不必实现Comparable
)。
在制作subSet()
,headSet()
等问题时,这也很尴尬...查询 - 我不想要id
对象的Event
我用它来设置查询边界。
我可以从头开始实现自定义(或者更有可能将繁重的工作委托给一些底层收藏),但是我想确保那里已经没有我丢失的东西了。
答案 0 :(得分:2)
听起来你真正想要的是TreeMultimap,尽管它目前不支持您想要的子多地图视图。但这可能会改变。也就是说,它的asMap方法返回一个完整的NavigableMap。