【问题标题】:How to sort two lists quickly in Java如何在 Java 中快速对两个列表进行排序
【发布时间】:2018-10-11 11:16:19
【问题描述】:

我有两个列表:

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

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

Object1.id = Object2.perId.

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

【问题讨论】:

  • 先展示你的努力..
  • 当您遇到困难时,我们可以帮助您发现问题。我们不是来做你的工作的。
  • 你可以做 list1.remove(list2) 然后调用 Arrays.sort 方法对剩余的条目进行排序
  • “快速”是什么意思?您是否正在寻找特定水平的效率?

标签: java list sorting


【解决方案1】:

使用集合在 Java 中快速排序列表。

Collections.sort(list1);
Collections.sort(list2);

如果您在排序后比较值:

for (Object1 o : list1) {
  for (Object2 p : list2) {
     if ((o.getSomeValue()).equals(p.getSomeValue())) list1.remove(o);
  }
}

为此,时间复杂度为 m x n。 (其中 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 的长度)

【讨论】:

  • if (set does not contain p) add p to the set 是任何 Set 实现在内部执行的操作,您不需要此 if 语句,您可以使用所有对象调用 add
【解决方案2】:

Object2s 中收集所有perIds 到一个HashSet 中,然后从list1 中过滤掉id 在该集合中的所有元素:

Set<Integer> ids = list2.stream()
        .map(x -> x.perId)
        .collect(toCollection(HashSet::new));
List<Object1> result = list1.stream()
        .filter(x -> !ids.contains(x.id))
        .collect(toList());

这假设您的 id 类型为 int,因此您可能需要相应地更改它。

此解决方案不要求您的两个类 Object1Object2 具有 equals()hashCode() 方法。

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2021-07-08
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-08-12
    • 2012-11-20
    相关资源
    最近更新 更多