簡體   English   中英

有效地從ArrayList獲取子列表

[英]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 / not null? 他們是平等的
  • 只有一個元素為空? none null是“較小”。

您正在尋找第一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM