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

问题描述 投票:0回答:1

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

我用两个for实现了它,但我不知道这是否会影响性能。 Java 8中是否有像streams这样的Java特性?

public class Object1 {
    private BigDecimal field1;
    private String field2;
    private String field3;
}
public class Object2 {
    private BigDecimal field1;
    private String field2;
}

List<Object1> list1 = new ArrayList<Object1>();
List<Object2> list2 = new ArrayList<Object2>();
List<Object1> listFilter = new ArrayList<Object1>();
for (Object object1 : list1) {
    for (Object object2 : list2) {
        if(object1.getField1().compareTo(object2.getField1())==0) {
            listFilter.add(object1);
            break;
        }
    }
}
java arraylist java-6
1个回答
0
投票

你的代码:

for (Object object1 : list1) {
    for (Object object2 : list2) {
        if(object1.getField1().compareTo(object2.getField1())==0) {
            listFilter.add(object1);
            break;
        }
    }
}

这是O(n2)时间复杂度。您应该首先将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数组而不是集合来优化它。在那些极为有限的情况下,这将进一步提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.