0

我有以下课程:

public class School{
    List<ClassRoom> classRooms;
}

public class ClassRoom{
    List<Student> students;
}

public class Student{
    String name;
    List<Long> typeIdList;
}

我只需要得到typeId给定教室中所有学生的共同因素。

为了能够让 typeID=123 的给定教室中的所有学生,我执行以下操作:

final long typeIdToSearchFor = ...;
Collection<Student> filtered = Collections2.filter(students,
    new Predicate<Student>() {
        @Override
        public boolean apply(Student s) {
            return s.typeId == typeIdToSearchFor;
        }
    }
);

只是想知道番石榴是否可以处理这样的事情?通过交集,我的意思是它必须在所有实例中出现才能考虑这种类型。

我知道for循环会更具可读性,但我只是发现了 Guava 功能。

4

3 回答 3

1

您可以使用Multiset可以计算出现次数的 a:

ClassRoom classRoom = /* comes from somewhere */;
List<Student> students = classRoom.getStudents();

// Aggregate all the typeIds.
Multiset<Long> typeIds = HashMultiset.create();
for (Student student : students) {
    // Assuming a student doesn't have duplicated typeIds:
    typeIds.addAll(student.getTypeIds());
}

// Find which typeIds are present for all the students.
for (Multiset.Entry<Long> entry : typeIds.entrySet()) {
    if (entry.getCount() == students.size()) {
        System.out.println(entry.getElement());
    }
}
于 2013-04-23T08:37:28.243 回答
0

如果您尝试检查所有Students 是否具有特定的typeIdIterables.all请与您现有的谓词一起使用。

您还可以创建一个由它们使用索引的Multimapof s :StudenttypeIdMultimaps.index()

Multimap<Long, Student> studentsByTypeId = Multimaps.index(students, new Function<Student, Long>() {
  public Long apply(Student s) {
    return s.typeId;
  }
};

然后您可以typeId使用studentsByTypeId.keySet().

typeId您可以使用.检查它们是否都共享相同的内容studentsByTypeId.keySet().size() == 1

于 2013-04-22T13:00:49.667 回答
0

如果您想要相交的那些,则不应与特定的进行比较,您至少应该检查它是否包含在另一个集合的 id 中。像这样:

new Predicate<Student>() {
    @Override
    public boolean apply(Student s) {
        return otherIds.contains(s.typeId);
    }
}

但是我仍然认为,如果您对两个集合都执行二进制搜索(在订购它们之后),您可以更快地得到答案。像这样的东西

Collections.sort(list1);
Collections.sort(list2);

List<E> intersected = new ArrayList<E>();

for(E element : list1){
    if(Collections.binarySearch(list2, element) >= 0){
        intersected.add(element);
    }
}

你甚至可以找到最小的列表。它可以帮助它获得一些性能。

于 2013-04-22T13:04:32.530 回答