如何根据java中的内部映射键值之一对Map <String,Map <String,String>>进行排序[重复]

Posted

技术标签:

【中文标题】如何根据java中的内部映射键值之一对Map <String,Map <String,String>>进行排序[重复]【英文标题】:how to sort Map<String, Map<String, String>>, based on one of the inside map key value in java [duplicate] 【发布时间】:2019-05-29 06:01:21 【问题描述】:

我在 java 中有一个 hashMap,想根据其中一个键值进行排序。 我的 hashmap 如下所示。

HashMap= < string, map <string,string> >

key="toUppercase" -> value= key="column_positions" -> value="4,5" ,
                             key="rule_order" -> value="3" 
key="replace" -> value=  key= "column_positions"-> value= "1,2" ,
                          key= "rule_order"-> value= "1" 
key= "concat" -> value=key= "column_positions"-> value= "6,7"
                        key ="rule_order"-> value= "2" 

我想根据 rule_order 对 hashmap 进行排序。你能帮帮我吗?

我对外部 hasmap 的预期输出是:

HashMap= < string, map <string,string> >

key="replace" -> value=  key= "column_positions"-> value= "1,2" ,
                          key= "rule_order"-> value= "1" 
key= "concat" -> value=key= "column_positions"-> value= "6,7"
                        key ="rule_order"-> value= "2" 
key="toUppercase" -> value= key="column_positions" -> value="4,5" ,
                             key="rule_order" -> value="3" 

谢谢。

【问题讨论】:

A HashMap 没有订单。您需要使用列表或SortedMap 查看树状图。 docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html您可以提供比较器或使用键的自然顺序。 【参考方案1】:

您不能按内部映射的键进行排序。此外,您无法对 HashMap 进行排序。 您可以使用 TreeMap 但将 ruleOrder 作为键。但在这种情况下,您将无法存储重复项。 (具有相同的规则顺序)。 您可以在运行时对地图进行排序:

Map<String, Map<String, String>> map = new HashMap<>();
 map.entrySet()
     .stream()
     .sorted(Comparator.comparing(en -> en.getValue().get("rule_order")))
     .forEach(this::doWork);

请将this::doWork 替换为需要的代码。 请注意,此示例不是 null 安全的。

【讨论】:

以上是关于如何根据java中的内部映射键值之一对Map <String,Map <String,String>>进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中的集合框架(中)

Java 之集合框架 中(10)

java map接口

如何在Scala中访问嵌套映射中的键值

Java集合Collection&Map

HashMapHashTableLinkedHashMap和TreeMap用法和区别