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

时间:2018-10-11 11:16:20

标签: java list sorting

我有两个列表:

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

我要从列表1中删除所有匹配的对象

Object1.id = Object2.perId.

有人能快速做到吗?

2 个答案:

答案 0 :(得分: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的长度)

答案 1 :(得分:1)

tickUpdate.select("text") .text(format) .attr("y", height * 7 / 6); 中的所有perId收集到Object2中,然后从HashSet中过滤出该集合中所有ID的元素:

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()); 类型,因此您可能需要相应地对其进行更改。

此解决方案不需要您的两个类intObject1拥有Object2equals()方法。