gpt4 book ai didi

java - 如何根据值对Hashmultimap进行排序?

转载 作者:行者123 更新时间:2023-12-01 12:45:28 25 4
gpt4 key购买 nike

我在代码中使用 HashMultiMap。我的 HashMultiMap 结构如下:

HashMultimap<String, Integer> map = HashMultimap.create();

map.put("a", 3);
map.put("m", 5);
map.put("l", 1);

System.out.println(map);

实际输出:{a=[3], l=[1], m=[5]}

现在,我想根据值对其进行排序:

目标输出:{m=[5], a=[3], l=[1]}

最佳答案

如果您确实想对值进行排序,解决方案是扩展 ForwardingSortedSetMultimap 并委托(delegate)给 TreeMultimap。

下面的示例期望键和值实现 Comparable,但可以轻松修改该类以支持提供的键和值比较器。

public class SortedValueTreeMultimap<K extends Comparable<K>, V extends Comparable<V>> extends
ForwardingSortedSetMultimap<K, V> {

private final Ordering<Map.Entry<K, Collection<V>>> mapEntryOrdering = new Ordering<Map.Entry<K, Collection<V>>>() {

@Override
public int compare(final Entry<K, Collection<V>> left, final Entry<K, Collection<V>> right) {

// Safe as we cannot have nulls or empties
return ComparisonChain.start()
.compare(left.getValue()
.iterator()
.next(), right.getValue()
.iterator()
.next())
.compare(left.getKey(), right.getKey())
.result();

}
};

public final Ordering<Entry<K, V>> entryOrdering = new Ordering<Map.Entry<K, V>>() {

@Override
public int compare(final Entry<K, V> left, final Entry<K, V> right) {

return ComparisonChain.start()
.compare(left.getValue(), right.getValue())
.compare(left.getKey(), right.getKey())
.result();
}

};

public final Comparator<Entry<K, V>> entryOrderingReverse = Collections.reverseOrder(this.entryOrdering);

private final SortedSetMultimap<K, V> delegate = TreeMultimap.create();

@Override
protected SortedSetMultimap<K, V> delegate() {

return this.delegate;
}

@Override
public Set<Entry<K, V>> entries() {
return FluentIterable.from(super.entries())
.toSortedSet(this.entryOrdering);

}

public Set<Entry<K, V>> reverseEntries() {
return FluentIterable.from(super.entries())
.toSortedSet(this.entryOrderingReverse);
}

@Override
public String toString() {
return FluentIterable.from(this.asMap()
.entrySet())
.toSortedSet(this.mapEntryOrdering)
.toString();

}

public static void main(final String... args) {

final SortedValueTreeMultimap<String, Integer> sortedMap = new SortedValueTreeMultimap<String, Integer>();

sortedMap.put("a", 7);
sortedMap.put("a", 3);
sortedMap.put("a", 7);
sortedMap.put("m", 5);
sortedMap.put("m", 4);
sortedMap.put("m", 4);
sortedMap.put("k", 1);
sortedMap.put("j", 1);

// [j=[1], k=[1], m=[4, 5], a=[7]]
System.out.println(sortedMap);

// [j=1, k=1, a=3, m=4, m=5, a=7]
System.out.println(sortedMap.entries());

// [a=7, m=5, m=4, a=3, k=1, j=1]
System.out.println(sortedMap.reverseEntries());
}
}

关于java - 如何根据值对Hashmultimap进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24747777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com