1. 程式人生 > >一道看似簡單的題(刪除List中的元素)

一道看似簡單的題(刪除List中的元素)

一道看似簡單的題目,我卻掉坑裡了。第一眼看到這題,沒考慮太多,就直接寫了size=0,結果答案當然就是錯了,當時還想不通。編個程式來除錯一下,終於弄懂了。

題目:下面程式碼結束後,list的內容是什麼?

		List list = new ArrayList();
		for(int i=0;i<10;i++){
			list.add("test" + i)	;
		}
		
		for(int j=0;j<list.size();j++){
			list.remove(j);
		}
沒有經驗的我,第一眼一看,就認為“全部刪除了,list空了。打印出來的應該是一個‘[]’,size=0”。可是我想錯了。當我除錯程式,看到列印結果後驚呆了。我們將程式修改一下,打印出來看看吧:
		List list = new ArrayList();
		for(int i=0;i<10;i++){
			list.add("test" + i)	;
		}
		
		System.out.println("remove前:\n size=" + list.size() + "\n list=" + list);
		
		for(int j=0;j<list.size();j++){
			list.remove(j);
		}
		System.out.println("remove後:\n size=" + list.size() + "\n list=" + list);
看一下列印結果:
remove前:
 size=10
 list=[test0, test1, test2, test3, test4, test5, test6, test7, test8, test9]
remove後:
 size=5
 list=[test1, test3, test5, test7, test9]
驚呆了,居然沒有全部刪掉!!!

分析一下原因吧。

從列印結果來看,第一個迴圈添加當然是沒問題的,十個元素都加進去了。第二個迴圈刪除,為何沒有全部刪掉呢?

因為再迴圈中,list的size在改變:最初 size=10

① j=0時:list.remove(j) 刪除了最初list中位置為0的元素test0,此時 list 的 size 就變成了9,list中的每個元素的位置都向前移動,移動後的位置為原來的減一(以下遞迴);

② j=1時:list.remove(j) 刪除了①list中位置為1的元素test2,此時 list 的 size 就變成了8;

③ j=2時:list.remove(j) 刪除了②list中位置為2的元素test4,此時 list 的 size 就變成了7;

④ j=3時:list.remove(j) 刪除了③list中位置為3的元素test6,此時 list 的 size 就變成了6;

⑤ j=4時:list.remove(j) 刪除了④list中位置為4的元素test8,此時 list 的 size 就變成了5;

⑥ j=5時,迴圈結束,因為 j=5 沒有滿足 “j<list.size()” 。此時list就是第⑤步結束後的list。

所以,在第二個迴圈刪除的時候只刪掉了“test0,test2,test4,test6,test8”。

從上面的分析,我們知道list在刪除的某個元素的時候其他元素的位置有可能會改變。

但是,如果我們換一種方式刪除的話,就不會出現位置變化的問題了,從最後一個元素開始刪除:

		List list = new ArrayList();
		for(int i=0;i<10;i++){
			list.add("test" + i)	;
		}
		
		System.out.println("remove前:\n size=" + list.size() + "\n list=" + list);
		
		for(int j=list.size()-1;j>-1;j--){  //list中的最後一個元素的位置是size-1
			list.remove(j);
		}
		System.out.println("remove後:\n size=" + list.size() + "\n list=" + list);
列印結果:
remove前:
 size=10
 list=[test0, test1, test2, test3, test4, test5, test6, test7, test8, test9]
remove後:
 size=0
 list=[]
這樣就全部刪掉了。

我是java菜鳥,期待您的指導!加油!!!