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

How do I convert this Java code from using TreeMap to TreeMultiMap?

我有一个方法 returns 一个属性调用源具有最高值的小部件,这工作正常,除非有多个小部件具有相同的值 源的最高值,在本例中它仅 returns 最后添加的小部件

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没有实现comparable但是我不能修改Widgetclass这是第三方提供的。我只需要排序的键和键的多值,我不需要排序的值所以也许还有另一个 class 我可以使用 ?

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

代码:

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());

第一个问题可以用 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());