从List <long>中包含的id <list>列表中获取All对象

Kri*_*ant -5 java collections comparison java-6

我如何从另一个中得到List<Object> filteredList id(Object.id)包含的内容.考虑到适度的数据量,在解决这个问题的时候,有效和高效的方法是什么.List<id> idsListList<Object>allObjects

我正在使用java6

Mic*_*ael 6

我不想多次迭代这两个列表

为什么?过早优化是一件坏事.首先测试它,测量它是否足够有效,并解决问题(如果存在).

您可以使用简单的过滤器来完成此操作:

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());
Run Code Online (Sandbox Code Playgroud)

使用流进行此操作的优点是您可以稍后将其并行化.


另一个优化是检查您对数据结构的使用.正如Seelenvirtuose指出的那样,使用像a这样的东西HashSet会降低contains从O(n)到O(1)的复杂性:

final Set<Long> rollNoList = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

如果你不能这样做,你可能会看到一些性能提升,以增加内存使用为代价,通过复制ListHashSet过滤之前:

final Set<Long> rollNumbers = new HashSet<>(rollNoList);
Run Code Online (Sandbox Code Playgroud)

但如果您可以控制数据结构,只需HashSet从头开始使用即可.