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

标签 java sorting guava

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

相关文章:

arrays - 对具有字母数字值的哈希数组进行排序

使用 Guava FutureCallback 接口(interface)进行 Java 多线程编程

generics - 如何使用 Guava Optional 作为 "naturally covariant object"

java - 在数组搜索中找不到用于打印用户输入的 if 语句

Java Regex - 非零正整数的字符串表示

java - 如何从java中的pfx文件/pem文件获取RSA公钥的指数和模值

Java 推回输入流

sorting - 使用 grep 的结果对文件进行排序

c++ - 对( double )实数 vector 进行排序并获得它们

java - Google Collections 相当于 Apache Commons Collections ArrayUtils.toObject 和 ArrayUtils.toPrimitive