我在代码中使用 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/