如何根据列表中的元素对地图中的键进行排序

时间:2019-09-15 19:09:36

标签: java java-8

我希望根据列表中可用的键(在列表中元素的顺序是不可变的)对地图中的元素进行排列/排序,以便使用Java在map和list中的键应具有相同的顺序。

地图中的数据:

{grocery=150, utility=130, miscellneous=90, rent=1150,
 clothes=120, transportation=100}

列表中的数据:

[utility, miscellneous, clothes, transportation, rent]

预期结果:

{utility=130, miscellneous=90, clothes=120, transportation=100, rent=1150 }

3 个答案:

答案 0 :(得分:3)

那不是一种。 您要从列表开始处理元素。
假设文本值为String,数字值为Integer,则可以执行以下操作:

Map<String, Integer> finalMap = 
list.stream()
    .collect(toMap(o->o, map.get(o), (a,b)->a, LinkedHashMap::new));

或仍然:

LinkedHashMap<String, Integer> finalMap = new LinkedHashMap<>();
list.forEach(o-> finalMap.put(o, map.get(o));

答案 1 :(得分:0)

您可以使用Comparator根据给定列表中地图的出现索引对地图进行排序,然后保留排序顺序,将其收集到{ {1}}:

LinkedHashMap

输出:

public static void main(String[] args) throws Exception {
        Map<String, Integer> map = new HashMap<>();
        map.put("grocery", 150);
        map.put("utility", 130);
        map.put("miscellneous", 90);
        map.put("rent", 1150);
        map.put("clothes", 120);
        map.put("transportation", 100);

        List<String> list = new ArrayList<>(
                            Arrays.asList("utility", "miscellneous", "clothes", 
                                          "transportation", "rent"));
        Map<String, Integer> sortedMap 
        = map.keySet()
             .stream()
             .filter(list::contains)
             .sorted(Comparator.comparing(list::indexOf))
             .collect(LinkedHashMap::new, 
                     (linkMap, key) -> linkMap.put(key, map.get(key)), 
                     Map::putAll);

        System.out.println(sortedMap);
 }

答案 2 :(得分:0)

您必须遍历必需的键列表并从Map中检索值。要保持秩序,您应该使用LinkedHashMap

public static Map<String, Integer> sort(Map<String, Integer> map, String[] keys) {
    return Arrays.stream(keys).collect(Collectors.toMap(key -> key, map::get, Integer::sum, LinkedHashMap::new));
}