从列表 <object> 中获取所有对象,其中 id 包含在列表 <long> 中
Get All object from a list <object> which id contains in List<long>
如何从另一个 List<Object>allObjects
中获取 List<Object> filteredList
其 ID (Object.id
) 包含在给定的 List<id> idsList
中。
考虑到中等数据量,就时间而言,解决此问题的有效方法是什么。
我正在使用 java6
I don't want to iterate both the list so many times
为什么?过早的优化是一件坏事。先测试一下,衡量是否足够高效,解决问题如果存在.
您可以使用简单的过滤器通过流完成此操作:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
用流来做的好处是你以后可以并行化它。
另一个优化是检查您对数据结构的使用。正如 Seelenvirtuose 指出的那样,使用 HashSet
之类的东西会将 contains
的复杂性从 O(n) 降低到 O(1):
final Set<Long> rollNoList = new HashSet<>();
如果您不能这样做,您也可能会看到一些性能提升,但会增加内存使用量,方法是在过滤之前将 List
复制到 HashSet
:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
但是如果你能控制数据结构,从头开始就用HashSet
。
如何从另一个 List<Object>allObjects
中获取 List<Object> filteredList
其 ID (Object.id
) 包含在给定的 List<id> idsList
中。
考虑到中等数据量,就时间而言,解决此问题的有效方法是什么。
我正在使用 java6
I don't want to iterate both the list so many times
为什么?过早的优化是一件坏事。先测试一下,衡量是否足够高效,解决问题如果存在.
您可以使用简单的过滤器通过流完成此操作:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
用流来做的好处是你以后可以并行化它。
另一个优化是检查您对数据结构的使用。正如 Seelenvirtuose 指出的那样,使用 HashSet
之类的东西会将 contains
的复杂性从 O(n) 降低到 O(1):
final Set<Long> rollNoList = new HashSet<>();
如果您不能这样做,您也可能会看到一些性能提升,但会增加内存使用量,方法是在过滤之前将 List
复制到 HashSet
:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
但是如果你能控制数据结构,从头开始就用HashSet
。