如何在 Java 中快速对两个列表进行排序

我有两个清单:

List<Object1> list1
List<Object2> list2
  • list1 对象包含一个 id。

  • list2 对象包含一个 perId。

我想从 list1 中删除所有匹配的对象

Object1.id = Object2.perId.

有没有人有办法快速做到这一点?


侃侃尔雅
浏览 207回答 2
2回答

慕桂英3389331

将perIds 中Object2的所有s收集到 a 中HashSet,然后从其list1id 在该集合中的所有元素中过滤掉:Set<Integer> ids = list2.stream()&nbsp; &nbsp; &nbsp; &nbsp; .map(x -> x.perId)&nbsp; &nbsp; &nbsp; &nbsp; .collect(toCollection(HashSet::new));List<Object1> result = list1.stream()&nbsp; &nbsp; &nbsp; &nbsp; .filter(x -> !ids.contains(x.id))&nbsp; &nbsp; &nbsp; &nbsp; .collect(toList());这假设您的 id 是 type int,因此您可能需要相应地更改它。此解决方案不需要您的两个类Object1并Object2具有equals()或hashCode()方法。

蝴蝶刀刀

使用集合在 Java 中快速排序列表。Collections.sort(list1);Collections.sort(list2);如果您在排序后比较值:for (Object1 o : list1) {&nbsp; for (Object2 p : list2) {&nbsp; &nbsp; &nbsp;if ((o.getSomeValue()).equals(p.getSomeValue())) list1.remove(o);&nbsp; }}为此,时间复杂度将是 mxn。(其中 m 是 list1 的长度,n 是 list2 的长度)如果你关心时间复杂度。一种更快的方法是遍历 list2 并将每个值添加到 HashSet。然后分别循环遍历 list1 并将这些值与我们在 HashSet 中的值进行比较。基本上它应该是这样的,但你必须用你的代码在它上面取得进展。HashSet<T> hSet = new HashSet<T>();&nbsp;for (Object2 p : list2) {&nbsp; &nbsp;if (!hSet.contains(p.getSomeValue())) {&nbsp; &nbsp; &nbsp; hSet.add(p);&nbsp; &nbsp;}&nbsp;}for (Object1 o : list1) {&nbsp; &nbsp;if (hSet.contains(o.getSomeValue())) {&nbsp; &nbsp; &nbsp; list1.remove(o);&nbsp; &nbsp;}&nbsp;}时间复杂度 = m + n(其中 m 是 list1 的长度,n 是 list2 的长度)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java