首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以按值的顺序迭代的映射。

可以按值的顺序迭代的映射。
EN

Stack Overflow用户
提问于 2012-01-17 14:51:56
回答 8查看 10.4K关注 0票数 16

我需要一个映射,它可以按其值的递减顺序迭代。像ApacheCommons或Guava这样的标准库提供这种映射吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-01-17 15:37:28

我要用番石榴做以下几件事:

代码语言:javascript
运行
复制
Ordering<Map.Entry<Key, Value>> entryOrdering = Ordering.from(valueComparator)
  .onResultOf(new Function<Entry<Key, Value>, Value>() {
    public Value apply(Entry<Key, Value> entry) {
      return entry.getValue();
    }
  }).reverse();
// Desired entries in desired order.  Put them in an ImmutableMap in this order.
ImmutableMap.Builder<Key, Value> builder = ImmutableMap.builder();
for (Entry<Key, Value> entry : 
    entryOrdering.sortedCopy(map.entrySet())) {
  builder.put(entry.getKey(), entry.getValue());
}
return builder.build();
// ImmutableMap iterates over the entries in the desired order
票数 13
EN

Stack Overflow用户

发布于 2012-01-17 18:23:47

对于番石榴,还有比@LoisWasserman的使用顺序与Functions.forMap相结合更干净的方法

代码语言:javascript
运行
复制
Ordering.natural().reverse().nullsLast().onResultOf(Functions.forMap(map, null))

或者如果值不是Comparable

代码语言:javascript
运行
复制
Ordering.fromComparator(yourComparator).reverse().nullsLast().onResultOf(Functions.forMap(map, null))

一个例子(具有第一个选项-自然排序):

代码语言:javascript
运行
复制
final Map<String, String> map = ImmutableMap.of(
    "key 1", "value 1",
    "key 2", "value 2",
    "key 3", "another value",
    "key 4", "zero value");

final Ordering<String> naturalReverseValueOrdering =
    Ordering.natural().reverse().nullsLast().onResultOf(Functions.forMap(map, null));

System.out.println(ImmutableSortedMap.copyOf(map, naturalReverseValueOrdering));

产出:

代码语言:javascript
运行
复制
{key 4=zero value, key 2=value 2, key 1=value 1, key 3=another value}

(我在这里使用ImmutableSortedMap,但如果需要可更改性,也可以使用TreeMap。)

编辑

如果有相同的值(更确切地说,如果有两个Comparator.compare(String v1, String v2)返回0的值),ImmutableSortedMap将抛出一个异常。排序不能返回,也就是说,您应该先按值排序,如果两个值相等(键不应该相等),则使用Ordering.compound命令下一步。

代码语言:javascript
运行
复制
final Map<String, String> map = ImmutableMap.of(
    "key 1", "value 1",
    "key 2", "value 2",
    "key 3", "zero value",
    "key 4", "zero value");

final Ordering<String> reverseValuesAndNaturalKeysOrdering =
    Ordering.natural().reverse().nullsLast().onResultOf(Functions.forMap(map, null)) // natural for values
        .compound(Ordering.natural()); // secondary - natural ordering of keys

System.out.println(ImmutableSortedMap.copyOf(map, reverseValuesAndNaturalKeysOrdering));

指纹:

代码语言:javascript
运行
复制
{key 3=zero value, key 4=zero value, key 2=value 2, key 1=value 1}
票数 12
EN

Stack Overflow用户

发布于 2017-10-20 23:56:30

现在可以使用Java 8流在一行中完成这一任务。

代码语言:javascript
运行
复制
map.entrySet().stream()
    .sorted(Comparator.comparing(Map.Entry::getValue))
    .forEach(...);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8896679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档