Map在java8中排序

原创
2016/11/24 22:59
阅读数 1.1K

##HashMap不是有序的 java1.8重新修改了HashMap,结构变为数组+链表+红黑树(链表>8).因此,顺序取决于hash。

@Test
public void testHashMapShouldBeOrderedButNotAlpha(){
    Map<String, Integer> unsortMap = new HashMap<>();
    unsortMap.put("z", 10);
    unsortMap.put("a", 6);
    unsortMap.put("d", 1);
    unsortMap.put("e", 7);
    unsortMap.put("b", 5);
    unsortMap.put("f", 8);
    unsortMap.put("n", 99);
    unsortMap.put("j", 50);
    unsortMap.put("c", 20);
    unsortMap.put("m", 2);
    unsortMap.put("f", 9);

    Assert.assertEquals("{a=6, b=5, c=20, d=1, e=7, f=9, z=10, j=50, m=2, n=99}",
            unsortMap.toString());
}

##使用stream排序收集为LinkedHashMap 因此,如果想要有序的map则必须转换成LinkedHashMap

@Test
public void testHashMapSortByValueDesc(){
    Map<String, Integer> unsortMap = new HashMap<>();
    unsortMap.put("z", 10);
    unsortMap.put("b", 5);
    unsortMap.put("a", 6);
    unsortMap.put("c", 20);
    unsortMap.put("d", 1);
    unsortMap.put("e", 7);
    unsortMap.put("y", 8);
    unsortMap.put("n", 99);
    unsortMap.put("j", 50);
    unsortMap.put("m", 2);
    unsortMap.put("f", 9);

    LinkedHashMap<String, Integer> orderMap = unsortMap.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (e1, e2) -> e1,
                    LinkedHashMap::new
            ));
    Assert.assertEquals("{n=99, j=50, c=20, z=10, f=9, y=8, e=7, a=6, b=5, m=2, d=1}",
            orderMap.toString());
    }

###参考

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部