我最近发现了一种很好的方法来对包含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));
有人可以帮助我理解这个命令中调用的每个过程,特别是从流函数继续吗?
由于
答案 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