【问题标题】:Datastructure like Treemap with duplicate keys and ceilingkey in JavaJava中具有重复键和天花板键的Treemap等数据结构
【发布时间】:2016-05-24 10:36:58
【问题描述】:

更新

Multimap<Double, PowerHost> createHostListofAvailableMIPS()
{
        List<PowerHost> tempList = hosts;
        Multimap<Double, PowerHost> listOfAvailableMIPS = TreeMultimap.create(Ordering.natural(), Ordering.arbitrary());

        for (PowerHost p : tempList)
        {
            //build tree
            listOfAvailableMIPS.put(p.getAvailableMips(), p);
        }
        return listOfAvailableMIPS;
}


PowerHost getHost (Vm vm)
    {
        this.reqdMIPS = vm.getMips();
        Multimap<Double, PowerHost> sortedPHs = createHostListofAvailableMIPS();
        PowerHost selectedHost = null;                  
        //gets mips that are >= reqdMIPS ie best matches
        NavigableSet<Double> ns =  (NavigableSet<Double>) sortedPHs.keySet();
        Double x = ns.ceiling(reqdMIPS);

//other codes follow

}

我注意到有一个 .在声明中是

Treemap.<Double, PowerHost>create().keySet().ceiling(K)

我相信这也可以,我回家后会试试这个。但是使用上面的代码:

NavigableSet<Double> ns = (NavigableSet<Double>) sortedPHs.keySet()

只返回一个项目,而不是一组 Doubles

java 中是否有任何内置结构是 Treemap + multimap 的特征集的组合?

我想要的基本上是一个可以支持多个/重复键的 Treemap。我知道多图(来自番石榴)可以做到这一点,但我不能在多图上使用天花板键(K)。

我最初的计划是使用 TreeMultimap,然后使用 keyset().ceiling(k) 但eclipse一直拒绝这些陈述:

Multimap <Double, someObject> myMM= TreeMultimap.create();  

抱怨“绑定不匹配”,说 someObject 不是

的有效替代品

keyset().ceiling(k) 抱怨 Set 中未定义方法上限。

帮助/建议将不胜感激。

【问题讨论】:

  • 1) 应该是keySet().ceiling(k)(注意大写的“S”)。 2) 我无法重现您的问题,因为 TreeMultimap.&lt;Double, Comparable&gt;create().keySet().ceiling(0.0); 对我来说编译得很好。您能否提供重现您遇到的问题的实际代码?

标签: guava treemap multimap ceil


【解决方案1】:

要解决第一个问题,您需要使用MultimapBuilder 而不是TreeMultimapTreeMultimap 要求键和值都是Comparable。使用MultimapBuilder,您可以将Comparable 键与非Comparable 值混合,仍然得到一个排序的keySet

ListMultimap<Double, SomeObject> myMM =
    MultimapBuilder.treeKeys().arrayListValues().build();

要解决第二个问题,您需要将返回的keySet 转换为SortedSet。 (这是documented as safe when using MultimapBuilder.treeKeys。)但这仍然不足以让您获得ceiling,因为它仅在NavigableMap 上可用:(您必须使用getFirst(tailSet(k), null) 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2017-01-24
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多