【问题标题】:Collections and Naturally ordering a Map<Long, Map<String, String>>集合和自然排序 Map<Long, Map<String, String>>
【发布时间】:2011-06-30 15:49:10
【问题描述】:

我在使用更复杂的地图时遇到了麻烦;对于标准的Map&lt;Long, String&gt;,我会这样做:

Ordering<Long> valueComparator = Ordering.natural().onResultOf(Functions.forMap(myMap));
Map<Long, String> orderedMap = ImmutableSortedMap.copyOf(myMap, valueComparator);

但我似乎无法让它喜欢Map&lt;Long, Map&lt;String, String&gt;&gt;,仍然由 Long 订购。也许我错过了什么?下面不起作用...

Ordering<Long> valueComparator = Ordering.natural().onResultOf(Functions.forMap(myOtherMap));
Map<Long, Map<String, String>> orderedMyOtherMap = ImmutableSortedMap.copyOf(myOtherMap,valueComparator);

【问题讨论】:

    标签: java map guava


    【解决方案1】:

    您的第一个示例并没有按照您所说的那样做。它正在创建一个按与每个 Long 键对应的 String 值排序的映射。如果您只想按钥匙订购,您只需:

    ImmutableSortedMap<Long, String> orderedMap = ImmutableSortedMap.copyOf(myMap);
    

    同样的事情也适用于Map&lt;Long, Map&lt;String, String&gt;&gt;。您尝试执行的操作不起作用的原因是 Map&lt;String, String&gt; 不是 Comparable,因此它没有自然排序。

    顺便说一句,您可能想考虑使用Table&lt;Long, String, String&gt; 而不是Map&lt;Long, Map&lt;String, String&gt;&gt;。甚至还有一个TreeBasedTable,它将按排序顺序存储行键和列键。

    【讨论】: