如果您确实想对值进行排序,解决方案是扩展 ForwardingSortedSetMultimap 并委托给 TreeMultimap。
下面的示例期望 Keys 和 Values 实现 Comparable,但可以轻松修改该类以支持提供的 Key 和 Value Comparator。
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());
}
}