【问题标题】:Sorting LinkedHashMap<String, ArrayList<String>> by counting the occurrences in ArrayList<String> problem通过计算 ArrayList<String> 问题中的出现次数对 LinkedHashMap<String, ArrayList<String>> 进行排序
【发布时间】:2021-10-28 19:51:18
【问题描述】:

我有:

ArrayList<String> miss;
LinkedHashMap<String, ArrayList<String>> map;

如何通过计算“miss”中的出现次数来对“maps”进行排序?例如:

  1. 未命中 => [3, 7]
  2. 地图 => {1=[0, 3, 6], 4=[2, 3, 4], 6=[0, 3 , 7], 11=[1, 3, 6], 17=[2, 6, 11]}

我想得到:

地图 => {6=[0, 3, 7], 1=[0, 3, 6], 4=[2, 3, 4], 11=[1, 3, 6], 17=[ 2, 6, 11]}

【问题讨论】:

标签: java sorting arraylist linkedhashmap


【解决方案1】:

以下解决方案基于使用 Stream API

  1. maps 的每个列表值中计算来自miss 的元素的频率,并将频率收集到某个对象(例如列表)中
  2. 按频率倒序对新对象排序,然后按初始映射的键(注意:键可能需要转换为 int 以提供预期的输出:1、4、11;比较作为字符串的键返回顺序 1、11、4)
  3. 使用 Collectors.toMapLinkedHashMap::new 供应商构建生成的地图
List<String> miss = List.of("3", "7");
Map<String, List<String>> maps = Map.of(
     "1", List.of("0", "3", "6"),
     "4", List.of("2", "3", "4"),
     "6", List.of("0", "3", "7"),
    "11", List.of("1", "3", "6"),
    "17", List.of("2", "6", "11")
);

Map<String, List<String>> sorted = maps.entrySet()
    .stream()
    .map(e -> Arrays.asList(e, 
        e.getValue().stream()
            .mapToInt(i -> (int) miss.stream().filter(i::equals).count())
            .sum()
    ))
    .sorted(Comparator
        .<List>comparingInt(ee -> (int) ee.get(1)).reversed()
        .thenComparingInt(ee -> Integer.parseInt(((Map.Entry<String, List<String>>) ee.get(0)).getKey()))
    )
    .map(ee -> (Map.Entry<String, List<String>>) ee.get(0))
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (v1, v2) -> v1,
        LinkedHashMap::new
    ));

System.out.println(sorted);

输出:

{6=[0, 3, 7], 1=[0, 3, 6], 4=[2, 3, 4], 11=[1, 3, 6], 17=[2, 6, 11]}

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2011-03-11
    • 2016-08-28
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多