java - 比较两个填充了不同类型对象的集合
问题描述
我在尝试比较两个大集合时遇到性能问题,我正在寻求一些帮助以找到更好的方法。
课程:
public class TypeOne {
private int id;
}
和
public class TypeTwo {
private int id;
}
编码:
Collection<TypeOne> oneColl = someMethodToPopulateThat();
Collection<TypeTwo> twoColl = anotherMethodToPopulateThat();
// Iterating both collections to match the elements by id
for(TypeOne one : oneColl) {
for(TypeTwo two : twoColl) {
if (one.getId().equals(two.getId()))
System.out.println(one.getId());
}
}
我已经尝试使用 Stream API 的一些功能,但没有成功。有没有人有任何想法来解决这个问题?请。
提前致谢。
解决方案
tl;博士
ones.stream().forEach(
one -> System.out.println(
twos.stream().filter( two -> two.getId() == one.getId() ).findAny().toString()
)
)
细节
我认为排序NavigableSet
会提高我们的搜索性能,尽管我还没有验证这种优化尝试是否有效。
NavigableSet < TypeOne > ones = new TreeSet <>( Comparator.comparingInt( TypeOne :: getId ) );
ones.addAll( collectionOfOnes ) ;
NavigableSet < TypeTwo > twos = new TreeSet <>( Comparator.comparingInt( TypeTwo :: getId ) );
twos.addAll( collectionOfTwos ) ;
循环一个可导航集,同时在另一个中搜索匹配项。
for( TypeOne one : ones )
{
Optional<TypeTwo> optionalTwo = twos.stream().filter( two -> two.getId() == one.getId() ).findAny() ;
// handle your Optional which may or may not contain an object.
}
推荐阅读
- merge - 读取和合并计算机集群上的大表
- angular - 从 JQuery-UI 回调到 Angular 6
- laravel - 在 Laravel 中搜索
- unit-testing - 带有任何参数的 Mockito when() 无法按预期工作
- javascript - 由于切换功能,div 被隐藏
- grails - 在 Grails 的 json 视图中访问控制器参数
- angular - 仅查询参数更改时重新加载 Angular 组件
- mongodb - Mongodb每月创建自动创建索引任务
- docker - 在 docker 中使用 gitlab 私有 repo 作为 golang 依赖项
- javascript - 谷歌地图,标记位置正确但中心不正确