这与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)方法?
答案 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(""));