[英]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.