java - 如何在 Java 中快速对两个列表进行排序
问题描述
我有两个清单:
List<Object1> list1
List<Object2> list2
- list1 对象包含一个 id。
- list2 对象包含一个 perId。
我想从 list1 中删除所有匹配的对象
Object1.id = Object2.perId.
有没有人有办法快速做到这一点?
解决方案
使用集合在 Java 中快速排序列表。
Collections.sort(list1);
Collections.sort(list2);
如果您在排序后比较值:
for (Object1 o : list1) {
for (Object2 p : list2) {
if ((o.getSomeValue()).equals(p.getSomeValue())) list1.remove(o);
}
}
为此,时间复杂度将是 mxn。(其中 m 是 list1 的长度,n 是 list2 的长度)
如果你关心时间复杂度。一种更快的方法是遍历 list2 并将每个值添加到 HashSet。然后分别循环遍历 list1 并将值与我们在 HashSet 中的值进行比较。基本上它应该看起来像这样,但你必须在你的代码上取得进展。
HashSet<T> hSet = new HashSet<T>();
for (Object2 p : list2) {
if (!hSet.contains(p.getSomeValue())) {
hSet.add(p);
}
}
for (Object1 o : list1) {
if (hSet.contains(o.getSomeValue())) {
list1.remove(o);
}
}
时间复杂度 = m + n(其中 m 是 list1 的长度,n 是 list2 的长度)
推荐阅读
- android - 具有默认样式的自定义复选框
- firefox - TestNG acript 在 FireFox 浏览器上不起作用。在 Chrome 浏览器上工作的相同脚本。安装壁虎驱动
- php - 通过 api 运行脚本时出现 Google App Script Api 404 错误
- sas - 如何在SAS中打印两组并排的变量系列?
- c++ - 显示数组中的学生 ID 和最高分
- php - 如何知道codeigniter 4中的分页总页数
- javascript - 有一个纯阶级的概念是否有意义?
- tableau-api - 如何部署/托管 Tableau 扩展
- json - MongoDB 的 json.loads() 问题
- macos-sierra - 为什么一个蒸汽“你好”项目在 Sierra 启动后就被粉碎了?