讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議71:推薦使用subList處理局部列表 >

建議71:推薦使用subList處理局部列表

我們來看這樣一個簡單的需求:一個列表有100個元素,現在要刪除索引位置為20~30的元素。這很簡單,一個遍歷很快就可以完成,代碼如下:


public static void main(Stringargs){

//初始化一個固定長度,不可變列表

List<Integer>initData=Collections.nCopies(100,0);

//轉換為可變列表

List<Integer>list=new ArrayList<Integer>(initData);

//遍歷,刪除符合條件的元素

for(int i=0,size=list.size();i<size;i++){

if(i>=20&&i<30){

list.remove(i);

}

}

}

或者

for(int i=20;i<30;i++){

if(i<list.size()){

list.remove(i);

}

}


相信首先出現在大家腦海中的實現就是此算法了,遍歷一遍,符合條件的就刪除,簡單而又實用。不過,還有沒有其他方式呢?有沒有"one-lining"一行代碼就解決問題的方式呢?

有,直接使用ArrayList的removeRange方法不就可以了嗎?等等,好像不可能呀,雖然JDK上有此方法,但是它有protected關鍵字修飾著,不能直接使用,那怎麼辦?看看如下代碼。


public static void main(String args){

//初始化一個固定長度,不可變列表

List<Integer>initData=Collections.nCopies(100,0);

//轉換為可變列表

ArrayList<Integer>list=new ArrayList<Integer>(initData);

//刪除指定範圍的元素

list.subList(20,30).clear();

}


上一個建議講解了subList方法的具體實現方式,所有的操作都是在原始列表上進行的,那我們就用subList先取出一個子列表,然後清空。因為subList返回的List是原始列表的一個視圖,刪除這個視圖中的所有元素,最終就會反映到原始字符串上,那麼一行代碼即解決問題了。