0

私は次のクラスを持っています:

public class School{
    List<ClassRoom> classRooms;
}

public class ClassRoom{
    List<Student> students;
}

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

typeId与えられたクラスルーム内のすべての生徒に共通する要素だけを取得する必要があります。

typeID=123 を持つ特定のクラス roomS 内のすべての生徒を取得できるようにするには、次のようにします。

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

Guavaがそのようなことを処理できるかどうか疑問に思っていますか? 交差とは、このタイプを考慮するためにすべてのインスタンスで発生する必要があることを意味します。

ループの方が読みやすいことはわかっていforますが、グアバの機能を発見しただけです。

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

交差するものが必要な場合は、特定のものと比較しないでください。少なくとも、それが他のコレクションの 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 に答える