[英]Get a sublist from an ArrayList efficiently
我的问题
我有一个固定大小的ArrayList,其中包含自定义变量。 尽管ArrayList具有固定的大小,但有时其中很多实际上都是null。 问题是我需要返回没有null变量的ArrayList。 需要注意的一件重要事情是: ArrayList首先包含所有非空项,然后是它们下面的所有空值,例如,元素不会混合。 示例:[非null,非null,.... null,null,null]
我的解决方法
我创建了一个for循环,它检查(从最后到第一个索引)ArrayList中的每个元素,以确定它是否为null。 如果为null,那么我将调用此代码:
for (i = size-1; i >=0 ; i--) {
groupList = new ArrayList<>(groupList.subList(0, i));
}
我的问题
如果ArrayList太大,这种方法可能会特别慢(或不是?)。 我想知道是否存在更好,更友好的解决方案。 AFAIK .subList方法很昂贵。
您可以使用二进制搜索的变体,其中您的自定义比较器是:
您正在寻找第一个null元素。
这将花费O(logn)时间,其中n
是数组的大小。
但是,将ArrayList
的子列表设为非null(假设您要将其复制到新的列表对象),将是复制元素的线性时间,因为您必须“触摸”它们中的每一个。
这给出了总时间复杂度O(logn + k)
,其中k
是非null元素的数量, n
是数组的大小。
根据你所有出色的建议,我修改了原始方法,以便我可以获取最后一个(第一个)空项目位置并只调用一次.subList方法。 这是:
int lastNullIndex = size - 1;
for (i = lastNullIndex; i >= 0; i--) {
if (null == groupList.get(i)) {
lastNullIndex = i;
} else {
break;
}
}
groupList = new ArrayList<>(groupList.subList(0, lastNullIndex));
return groupList;
如果您认为可以进一步修改以便获得更好的性能,请告诉我们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.