【问题标题】:SortedMultiset which returns collection of objects (not simply count of objects)?SortedMultiset 返回对象的集合(不仅仅是对象的计数)?
【发布时间】: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


    【解决方案1】:

    听起来你真正想要的是 TreeMultimap,尽管它目前不支持你想要的子多地图视图。不过,这可能会改变。也就是说,它的 asMap 方法返回一个完整的 NavigableMap。

    【讨论】:

    • 嗯...我认为TreeMultimap&lt;TimeStamp,Event&gt;.create( Ordering.natural(), Ordering.arbitrary() ) 结合asMap() 几乎可以满足我的所有需求。我唯一担心的是Ordering.arbitrary() 依赖于== 身份平等而不是equals()。我将不得不考虑使用equals() 创建一个类似的Ordering,还是有什么原因不存在?
    • 仔细查看ArbitraryOrdering 后,看起来== 可以替换为equals() 和identityHashCode() 替换为hashCode() 没有问题。我想知道为什么 ArbitraryOrdering 没有像一开始那样实现。
    • 使用Multimaps.newListMultimap(TreeMap, Supplier&lt;ArrayList&gt;) 而不是像这样使用Ordering.arbitrary()。 (老实说,人们使用Ordering.arbitrary() 作为TreeMultimaps 的值比较器是我们考虑弃用或删除Ordering.arbitrary() 的很大一部分原因。)
    • 是的,我对此并不满意,但我不知道 Guava 能够使用任何提供的地图和集合供应商构建自定义多地图。我想为我的值设置语义(通过equals() 定义),所以我最终可能会使用Multimaps.newSetMultimap(TreeMap, Supplier&lt;HashSet&gt;)。但它看起来会很好用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2018-05-03
    • 1970-01-01
    • 2021-10-02
    • 2021-11-29
    相关资源
    最近更新 更多