迭代条目列表的地图

时间:2018-06-04 04:07:58

标签: java algorithm data-structures

这与Java 7有关 我们按照优先级List<SubjectId>的顺序列出了一系列主题 有一个学生地图列出了选择的主题 - Map<StudentId,List<SubjectId>>
目的是找到所有人选择的最高优先级主题(共同分母),并将其作为地图反对所有学生。

输入:

List<SubjectId>=['1021','1023','1025']

Map<StudentId,List<SubjectId>>={'1',['1025,'1027'];'2',['1021',1025'];'3',['1022','1025']}

Output Map = {'1','1025';'2','1025';'3','1025'}

目前,我们迭代每个主题的整个学生列表 - 沿途组成输出地图 如果发现任何主题遗失 - 地图被丢弃 - 我们继续进行下一个主题。

是否有更有效的O(n)方法?

2 个答案:

答案 0 :(得分:1)

据我了解,所有学生都必须选择该主题才能被选中。如果是这样,这会大大简化解决方案。

您需要输出地图吗?为什么不输出结果主题,因为地图将永远是所有学生的重复。

我能想到的一个简单的解决方案是使用可用于集合的stream函数(https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#stream--),然后使用filter函数(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate-)您的学生地图+选择的科目可以从包含所有可用科目的列表中筛选出未选择的科目。

您还必须创建自己的谓词,该谓词将遍历每个学生的所有科目,这些科目可能没有您想要的那样优化。

答案 1 :(得分:0)

    //subjects in order of priority
    List<String> list = Arrays.asList("1021", "1023", "1025", "1027");

    Map<String, List<String>> map = new HashMap<>();
    map.put("1", Arrays.asList("1021","1025", "1027"));
    map.put("2", Arrays.asList("1021", "1025"));
    map.put("3", Arrays.asList("1023", "1025", "1021"));

    //intersect
    Set<String> intersection = map.values().stream().map(HashSet::new)
        .collect(() -> new HashSet<>(list), Set::retainAll, Set::retainAll);

    //find highest priority
    Optional<String> first = list.stream().filter(intersection::contains).findFirst();
    System.out.println("first = " + first.orElse(""));