我有两个Pojo Classes,其中包含具有唯一ID的不同字段。
我想执行两个List<A>
和List<B>
的交集。
什么是最好的方法。一个是我可以简单地迭代两次但是然后复杂性太高n2。
有更好的方法吗?我可以用比较器吗?
Class A {
Id, Name ,DOB}
Class B{
id, aid ,location }
我有A的列表和B的列表
现在想要获取A的列表,其中包含位于B
的位置答案 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)
按照Id的递增顺序对列表进行排序。
从列表A开始,在列表B中找到相应的索引。 记住列表B的当前索引。说(indB)
从列表A的下一个索引开始,并从列表B开始比较(indB + 1)
从步骤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