根据另一个对象列表的字段筛选对象列表

时间:2017-12-16 19:03:23

标签: java arraylist java-6

使用Java 6,如何更好地了解对象列表是否包含另一个对象列表的字段?

我使用两个fullDeck: SingleCard[] = []; 实现了它,但我不知道这是否会影响性能。是否有Java 8中的for等Java功能?

streams

1 个答案:

答案 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数组而不是集合。在那些极为有限的情况下,这将进一步提高性能。