我有两个列表:
List<Object1> list1
List<Object2> list2
我要从列表1中删除所有匹配的对象
Object1.id = Object2.perId.
有人能快速做到吗?
答案 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());
类型,因此您可能需要相应地对其进行更改。
此解决方案不需要您的两个类int
和Object1
拥有Object2
或equals()
方法。