Map在java8中排序

泄露秘密 提交于 2019-12-05 01:37:05

##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());
    }

###参考

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!