【发布时间】:2019-05-10 20:12:03
【问题描述】:
我正在尝试将Map<String, Map<String, String>> 转换为LinkedHashMap<String, Double>,同时按特定的内部value 进行排序。我的挣扎不在于排序,而在于过程中的转换。
鉴于这些孩子 Map 和 1 个父母 Map:
Map<String, String> man = new HashMap<>();
man.put("h_ratio", "0.45");
man.put("w_ratio", "0.75");
man.put("a_ratio", "0.19");
Map<String, String> bear = new HashMap<>();
bear.put("h_ratio", "0.23");
bear.put("w_ratio", "0.72");
bear.put("a_ratio", "0.95");
Map<String, String> pig = new HashMap<>();
pig.put("h_ratio", "0.37");
pig.put("w_ratio", "0.64");
pig.put("a_ratio", "0.81");
Map<String, Map<String, String>> unsortedOrganisms = new HashMap<>();
unsortedOrganisms.put("man", man);
unsortedOrganisms.put("bear", bear);
unsortedOrganisms.put("pig", pig);
我如何有效地创建LinkedHashMap<String, Double> 按a_ratio 排序,结果是:
{bear={0.95}, pig={0.81}, man={0.19}}
unsortedOrganisms的真实大小为50000,每个内部Map的真实大小为50。
Research shows最高效的方式可能是
从地图中创建
Entry集合中的List,然后使用以下方法对List进行排序Collections.sort()
但是,该示例假定输出 Map 与输入映射具有相同的结构。而我的结果需要转换为<String, Boolean> 类型的LinkedHashMap
【问题讨论】:
-
“但是该示例假定输出映射与输入映射具有相同的结构” 该示例不会创建“输出映射”。它创建一个列表,对其进行排序,然后将其保留为列表。
-
哦,对了。但第一行是
Set<Entry<String, Integer>> set = map.entrySet();,然后传递到创建的List。我不知道如何将我的map.entrySet()有效地转换为我应该创建的List,然后如图所示进行排序。 -
我的第一行是
Set<Map.Entry<String, Map<String, String>>> set = unsortedOrganisms.entrySet(); List<Map.Entry<String, Map<String, String>>> list = new ArrayList<>(set);所以我正在对格式不正确的列表进行排序。 -
顺便说一句,这是存储这些数据的一种糟糕的方式:为有机体定义一个具有三个字段的类,每个字段一个;并将比率实际存储为数字类型。
标签: java collections hashmap