我需要一个映射,它可以按其值的递减顺序迭代。像ApacheCommons或Guava这样的标准库提供这种映射吗?
发布于 2012-01-17 15:37:28
我要用番石榴做以下几件事:
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发布于 2012-01-17 18:23:47
对于番石榴,还有比@LoisWasserman的使用顺序与Functions.forMap相结合更干净的方法
Ordering.natural().reverse().nullsLast().onResultOf(Functions.forMap(map, null))或者如果值不是Comparable
Ordering.fromComparator(yourComparator).reverse().nullsLast().onResultOf(Functions.forMap(map, null))一个例子(具有第一个选项-自然排序):
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));产出:
{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命令下一步。
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));指纹:
{key 3=zero value, key 4=zero value, key 2=value 2, key 1=value 1}发布于 2017-10-20 23:56:30
现在可以使用Java 8流在一行中完成这一任务。
map.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getValue))
.forEach(...);https://stackoverflow.com/questions/8896679
复制相似问题