java中两个不同对象列表的交集

时间:2012-01-17 07:43:01

标签: java algorithm

我有两个Pojo Classes,其中包含具有唯一ID的不同字段。

我想执行两个List<A>List<B>的交集。

什么是最好的方法。一个是我可以简单地迭代两次但是然后复杂性太高n2。

有更好的方法吗?我可以用比较器吗?

Class A {
Id, Name ,DOB}

Class B{
id, aid ,location }

我有A的列表和B的列表

现在想要获取A的列表,其中包含位于B

的位置

5 个答案:

答案 0 :(得分:3)

Apache Commons Collections有一种方法可以做到这一点:CollectionUtils.intersection。但是,它不使用泛型。

还有这个问题:List intersection in java

答案 1 :(得分:2)

您可以将List<B>的元素放入HashMap<Integer,B>id为关键字。

完成此操作后,您可以迭代List<A>的元素,并使用哈希映射快速查找相应的B元素。这将提供您需要的结构(“A列表B”。

答案 2 :(得分:2)

  1. 按照Id的递增顺序对列表进行排序。

  2. 从列表A开始,在列表B中找到相应的索引。 记住列表B的当前索引。说(indB)

  3. 从列表A的下一个索引开始,并从列表B开始比较(indB + 1)

  4. 从步骤1到4重复,直到列表A结束或列表B结束。

答案 3 :(得分:1)

试试这个:

public static void main(String[] args) {System.nanoTime()
    List<A> as = new ArrayList<A>();
    List<B> bs = new ArrayList<B>();

    // Collect all A.ids in the list of B into a Set
    Set<String> baids = new HashSet<String>();
    for (B b : bs)
        baids.add(b.aid);

    // iterate through the list of A discarding those that don't have a B
    for (Iterator<A> i = as.iterator(); i.hasNext();)
        if (!baids.contains(i.next().Id)) // contains() executes fast for a Set
            i.remove();

    // now list "as" contains all A that have a B with A.Id = B.aid 
}

答案 4 :(得分:0)

使用Java 8流

anchors.fill: parent