我們來看這樣一個簡單的需求:一個列表有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是原始列表的一個視圖,刪除這個視圖中的所有元素,最終就會反映到原始字符串上,那麼一行代碼即解決問題了。