包含Integer值的2 ArrayList的INTERSECT结果

时间:2012-07-13 10:24:50

标签: java performance arraylist intersection

我有两个 ArrayList 都包含 Integer 值。我的目标是比较这两个列表得到相同/共同/重复的值。换句话说(在SQL术语中),我需要两个列表的INTERSECT结果,即两个列表中都出现的值。

示例:

ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(100);
list1.add(200);
list1.add(300);
list1.add(400);
list1.add(500);

ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(300);
list2.add(600);

我可以想到的一种实现/解决方案是循环其中一个列表:

ArrayList<Integer> intersectList = new ArrayList<Integer>();

for (Integer intValue : list1) 
{
    if(list2.contains(intValue))
        intersectList.add(intValue);
}

在这种情况下,intersectList只会添加1个整数项,即300,它会出现在两个列表中。

我的问题是,有没有更好/最快/更有效的方法来实现这个逻辑? Apache Commons库中可用的任何选项?任何其他想法/建议/意见表示赞赏。

注意:为了便于说明,我刚刚在此处显示了5项和2项添加到列表中。在我的实时实现中,每个列表中将有超过1000个元素。因此,性能也是要考虑的关键因素

3 个答案:

答案 0 :(得分:4)

如果你可以覆盖list1的结果:

list1.retainAll(list2);

否则首先克隆/复制list1。

虽然对表现不确定。

答案 1 :(得分:0)

list1.retainAll(list2)//for intersection

答案 2 :(得分:0)

如果您不想修改现有列表,请使用org.apache.commons.collections中的ListUtils。

ListUtils.intersection(list1, list2)