如何将此Java代码从使用TreeMap转换为TreeMultiMap?

时间:2015-07-24 12:29:47

标签: java guava treemap generic-collections

我有一个方法可以返回一个属性调用源值最高的窗口小部件,这个工作正常,除非有多个窗口小部件具有相同的窗口小部件     源的最高值,在这种情况下,它只返回添加的最后一个小部件

private Widget getWidgetWithMostSources(List<Widget> Widgets)
{
    SortedMap<Integer,Widget> mapOfWidgetsSortedBySources = new TreeMap<Integer, Widget>();
    for(Widget next:Widgets)
    {
        mapOfWidgetsSortedBySources.put(next.getSources().intValue(), next);
    }
    //Just return the Widget with the highest source value
    Widget Widget = mapOfWidgetsSortedBySources.get(mapOfWidgetsSortedBySources.lastKey());
    return Widget;
}

因此我尝试使用Google Guavas TreemultiMap,但我有两个问题,

  1. 它不像我构造TreeMultiMap时声明的泛型变量。 更新我认为这是因为Widget没有实现可比性,但我无法修改由第三方提供的Widget类。我只需要键的键和多值,我不需要排序值所以也许还有另一个我可以使用的类?

  2. 没有lastKey()方法,所以我该如何解决这个问题:

  3. 代码:

    private List<Widget> getWidgetWithMostSources(List<Widget> Widgets) {
        List<Widget> filteredWidgets = new ArrayList<Widget>();
        TreeMultimap<Integer, Widget> mapOfWidgetsSortedBySources = TreeMultimap.create();
        for (Widget next : Widgets) {
            mapOfWidgetsSortedBySources.put(next.getSources().intValue(), next);
        }
        //Just return the Widget with the highest source linked to the acoustid
        Set<Widget> WidgetsWithHighestSources = mapOfWidgetsSortedBySources.get(mapOfWidgetsSortedBySources.keys().lastKey());
        filteredWidgets.addAll(WidgetsWithHighestSources);
        return filteredWidgets;
    }
    

    更新

    这个编译,我认为可以满足我的需求:

    TreeMultimap<Integer, Recording> mapOfRecordingsSortedBySources = TreeMultimap.create(Ordering.natural(), Ordering.arbitrary());
    

1 个答案:

答案 0 :(得分:1)

第一个问题可以通过TreeMultimap<Integer, Widget> mapOfWidgetsSortedBySources = TreeMultimap.create(Ordering.natural(), Ordering.allEqual());

解决

要解决第二次使用asMap()方法以获取NavigableMap然后调用lastKey()

或者您可以使用lastEntry并节省mapOfWidgetsSortedBySources.get来电时间。

结果我们有

private List<Widget> getWidgetWithMostSources(List<Widget> widgets) {
    List<Widget> filteredWidgets = new ArrayList<Widget>();
    TreeMultimap<Integer, Widget> mapOfWidgetsSortedBySources = TreeMultimap.create(Ordering.natural(), Ordering.allEqual());
    for (Widget next : widgets) {
        mapOfWidgetsSortedBySources.put(next.getSources().intValue(), next);
    }
    //Just return the Widget with the highest source linked to the acoustid
    Collection<Widget> widgetsWithHighestSources = mapOfWidgetsSortedBySources.asMap().lastEntry().getValue();
    filteredWidgets.addAll(widgetsWithHighestSources);
    return filteredWidgets;
}

警告使用Ordering.arbitrary()代替Ordering.allEqual()

或者更好地使用MultimapBuilder.treeKeys().arrayListValues().build()代替TreeMultimap.create(Ordering.natural(), Ordering.allEqual());