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

标签 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()方法,那么我该如何解决这个问题:

代码:

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

关于java - 如何将此 Java 代码从使用 TreeMap 转换为 TreeMultiMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31610598/

相关文章:

java - 如何使用 Java8s lambdas 改进日志记录机制

java - JPA获取数据时的多对一持久性问题

Java 'ext' 目录与 -Xbootclasspath/p :

java - 遍历 Guava LoadingCache 的 map View 条目集是否会重置用于过期的访问时间?

java - 如何将 Treemap 写为 csv

java - 使用 Apache Commons 文件上传解析 multipart/form-data

java - 用连续的整数范围填充列表

java - 使用 Commons 或 Guava 将文本文件转换为 Java Set<String>

generics - 为什么对于具有相同模板值参数类型的比较器类型未定义 TreeMap 构造函数?

java - 获取 TreeMap 中给定节点的所有子节点