按降序排序java8的地图

时间:2016-04-20 20:39:23

标签: java sorting dictionary java-8

private static <K, V extends Comparable<? super V>> Map<K, V>
    sortByValue( Map<K, V> map )
    {
        Map<K, V> result = new LinkedHashMap<>();
        Stream<Map.Entry<K, V>> st = map.entrySet().stream();

        st.sorted( Map.Entry.comparingByValue() )
                .forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

        return result;
    }

这是来自this帖子的示例。有用。问题是它按升序排序。如何将其更改为降序?

我可以这样做:

public static <K, V extends Comparable<? super V>> Map<K, V>
sortByValue( Map<K, V> map )
{
    List<Map.Entry<K, V>> list =
            new LinkedList<Map.Entry<K, V>>( map.entrySet() );
    Collections.sort( list, new Comparator<Map.Entry<K, V>>()
    {
        public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 )
        {
            return (o2.getValue()).compareTo( o1.getValue() );//change o1 with o2
        }
    } );

    Map<K, V> result = new LinkedHashMap<K, V>();
    for (Map.Entry<K, V> entry : list)
    {
        result.put( entry.getKey(), entry.getValue() );
    }
    return result;
}

我可以通过改变这一行的顺序来做到这一点:return (o2.getValue()).compareTo( o1.getValue() );但是我想尝试使用lambda expr。

2 个答案:

答案 0 :(得分:7)

您可以使用Comparator's default method reversed()来反转比较感,以便对其进行降序排序。

这里的类型推断似乎有些偏差,但向for pic in soup.find_all('img', width=True, height=True): print(pic['width'], pic['height']) 提供显式类型参数可以解决问题。

comparingByValue()

答案 1 :(得分:0)

你可以使用已经提供的比较器并将compareTo返回值乘以-1或者只是交换参数(以考虑角点情况)。

(a,b)-->{comparingByValue().compareTo(b,a)}