我有两个 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个元素。因此,性能也是要考虑的关键因素。
答案 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)