我尝试使用lambda表达式和流管道Java 8:
Map<String, List<String>> result = new HashMap<>();
所以,第一部分(按自然顺序排序)很容易,但我对第二部分有困难。
排序应该按照列表(List<String>)
的元素进行,结果如下所示:
input:
{E, [G,B,H]}
{C, [E,A,B]}
{A, [M,D,C]}
output:
{A, [C,D,M]}
{C, [A,B,E]}
{E, [B,G,H]}
sort byKey的第一部分如下所示:
result.entrySet().stream()
.sorted(Map.Entry.comparingByKey()).forEach(e -> {
System.out.println(e.getKey() + " " + e.getValue() );
});
但正如我之前提到的,我不知道如何确切地做下一步:
result.entrySet().stream()
.sorted(Map.Entry.comparingByKey()
.thenComparing((e1,e2) -> e1.getValue().stream().sorted((s1,s2) -> s1.compareTo(s2)))
)
.forEach(e -> {
System.out.println(e.getKey() + " " + e.getValue() );
});
这个lambda表达式给了我一些编译错误。你也可以添加源代码来阅读吗?
2条答案
按热度按时间nfeuvbwi1#
你不能依赖键在结果Map中保持排序顺序,因为Map本身是无序的。它看起来可能有效,但它取决于键的
hashCodes
和其他Map因素。但对于较大的Map,你不能依赖它。要解决这个问题,您可以指定一个TreeMap,它维护键的排序顺序,然后作为结果Map,并使用streams
对列表进行排序。印刷品
另一种方法是根据键对
Entry
进行排序,然后指定一个LinkedHashMap
,LinkedHashMaps保留它们的插入顺序,其他一切都和上面一样。uqzxnwby2#
你就快到了。
如果要执行
sort the original map
并创建新的排序Map,可以使用以下代码