使用Java 6,如何更好地了解对象列表是否包含另一个对象列表的字段?
我使用两个fullDeck: SingleCard[] = [];
实现了它,但我不知道这是否会影响性能。是否有Java 8中的for
等Java功能?
streams
答案 0 :(得分:0)
您的代码:
for (Object object1 : list1) {
for (Object object2 : list2) {
if(object1.getField1().compareTo(object2.getField1())==0) {
listFilter.add(object1);
break;
}
}
}
这是 O(n 2 ) 时间复杂度。您应首先将Object2.field1
值放入Set<?>
,然后检查是否存在 O(n)
// Build a Set of unique Object2.field1 values
Set<BigDecimal> o2f1set = new HashSet<BigDecimal>();
for (Object2 o2 : list2)
o2f1Set.add(o2.getField1);
// Select Object1 instances whose field1 value matches any
// field1 value that was in list2
for (Object1 o1 : list1)
if (o2f1Set.contains(o1.getField1())
listFilter.add(o1);
这当然假设field1
的班级正确实施了equals()
和hashCode()
BigDecimal
。
如果可能field1
值的范围是整数,强有界且相对较小(即您的要求和模型将值限制为范围,比如0..1000
),则可以使用boolean
数组而不是集合。在那些极为有限的情况下,这将进一步提高性能。