代码之家  ›  专栏  ›  技术社区  ›  IUnknown

条目列表的迭代映射

  •  -2
  • IUnknown  · 技术社区  · 8 年前

    这属于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 回复  |  直到 8 年前
        1
  •  0
  •   gagan singh    8 年前
        //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(""));
    
        2
  •  1
  •   Olivier Samson    8 年前

    据我所知,所有的学生都选择了这个科目。如果是这样,这就大大简化了解决方案。

    你需要输出图吗?为什么不直接输出结果主题,因为地图对所有学生都是重复的。

    我能迅速想到的一个简单的解决方案是使用 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- )在学生+选择的科目的地图上,从包含所有可用科目的列表中筛选出未选择的科目。

    您还必须创建自己的谓词,该谓词将遍历每个学生的所有主题,可能没有您希望的那样优化。