地图值和集合的交集

时间:2018-07-01 13:35:50

标签: java algorithm

我有一个假设映射-HashMap<String,List<String>> mapteachertostudents
有一个单独的集合-Set<String> giftedstudents
要求是简单地使用Java 1.7打印出普通学生

mapteachertostudents { 'A':'a,b,c';'B':'b,e';'C':'b,c,f'}
giftedstudents ['b','c','e']
expected output ['b']

是否有比迭代每个老师和维持状态更有效的例程,因为考虑到此比较每个必须在10000多张地图上进行。

1 个答案:

答案 0 :(得分:3)

每一种可能的算法都将涉及遍历所有老师并检查每位老师的学生,这是没有办法的。就效率而言,我认为retainAll应该是在Java中派生集合交集的最有效方法。

public static <T> Set<T> intersect(
        Collection<? extends Collection<T>> sets) {
    if (sets.isEmpty()) return Collections.emptySet();

    Iterator<? extends Collection<T>> it = sets.iterator();
    Set<T> intersect = new HashSet<>(it.next());
    while (it.hasNext()) {
        intersect.retainAll(it.next());
    }
    return intersect;
}

这可以让你做

Set<String> commonStudents = intersect(mapteachertostudents.values());

泛型使该方法具有通用性,因此它不仅限于HashMap<String,List<String>>,还可以使用它与任何集合集合相交。