【问题标题】:Filter ArrayList that has similar data过滤具有相似数据的 ArrayList
【发布时间】:2013-04-21 15:45:18
【问题描述】:

我有以下课程:

public class School{
List<ClassRoom> classRooms;
}

public class ClassRoom{
List<Student> students;
}

public class Student{
String name;
long typeId;
}

我需要让 typeID=123 的给定教室 S 中的所有学生

预期结果:

列出filteredStudent=classRoomList.filterByStudentTypeID(typeIdToSearchFor)

我不需要写一些脏代码和循环。

我需要利用现有的库。 我发现了 Google Guava。

我在 guava 找到了一种方法,它可以通过整个参考进行搜索...而不是我需要使用属性 typeId 进行搜索

Collection<Student> filtered =Collections2.filter(students, Predicates.equalTo(s1));

任何想法!

【问题讨论】:

  • I don't need to write some dirty code and loops...哇。也许你需要献身于不同的学科。你考虑过手机卫生吗?
  • 编写您自己的 Predicate 实现并在对 filter 的调用中使用它。

标签: java collections guava


【解决方案1】:

由于您使用的是 Guava,因此您可以使用自定义谓词:

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

请注意,typeIdToSearchFor 在对filter 的调用范围内必须是final,因为它被(匿名)Predicate 子类引用。

【讨论】:

  • 感谢 Ted Hopp 的帮助。
  • 也就是说,值得将其与“脏”循环并排查看并比较哪个更具可读性。
  • @LouisWasserman - 阿门。当然,如果 OP 发现某种可重用的 Predicate 实现有用,那可能会支持这种方法。不过,对于一次性要求,我会选择循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多