Java按键说明排序地图

时间:2017-12-05 09:13:43

标签: java sorting java-8 hashmap

我最近发现了一种很好的方法来对包含GregorianCalendar作为键的地图进行排序。

Map<GregorianCalendar, String> map = new HashMap<>();

Map<GregorianCalendar, String> sortedMap = map.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
            (oldValue, newValue) -> oldValue, LinkedHashMap::new));

有人可以帮助我理解这个命令中调用的每个过程,特别是从流函数继续吗?

由于

3 个答案:

答案 0 :(得分:4)

map.entrySet().stream()生成输入Stream的{​​{1}}条目(即Map

Stream<Map.Entry<GregorianCalendar,String>>按条目的键对此.sorted(Map.Entry.comparingByKey())的元素进行排序(它依赖于键类型 - Stream - 实现GregorianCalendar)。< / p>

Comparable

生成.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)),其中包含与输入LinkedHashMap相同的条目。由于您使用的是Map,因此会保留插入顺序,并且由于您按键对LinkedHashMap的条目进行了排序,因此您获得了Stream,其插入顺序(和迭代顺序)为根据钥匙的顺序。

当然,通过将输入Map的所有条目放在Map中,您可以更轻松地获得排序Map

TreeMap

即使您向Map<GregorianCalendar, String> sortedMap = new TreeMap<>(map); 添加新条目,这也有保持订单的优势。

答案 1 :(得分:2)

首先,您通过Map

Key排序

然后将这些收集到sorted(Map.Entry.comparingByKey())(下面的实现使用Map),其中HashMap的类型为Key,值为{{1} }}。该代码还提供合并功能:

GregorianCalendar

当发生冲突时,它们保留最后一个值,如“最后胜利”政策。因此,当这些是碰撞(两个相同的String值)时,您将始终保持第二个,无论第二个意味着什么。由于您的流媒体资源是(oldValue, newValue) -> oldValue ,但没有定义的订单,如果您在初始地图中添加或删除了值,则此“秒”可能会发生变化。

一旦对它们进行了排序并将它们收集到GregorianCalendar(通过HashMap),您的订单就会中断,因此收集发生在HashMap基本上保留了排序顺序

答案 2 :(得分:0)

我只想为这种排序留一个通用方法,因为这对我来说有点棘手

bp::system("grep -c false /etc/passwd"); // ok
bp::system("grep", "-c", "false", "/etc/passwd"); // fails

bp::system(cmd="grep -c false /etc/passwd"); // ok
bp::system(exe="grep", args={"-c", "false", "/etc/passwd"}); // fails
相关问题