一次性刪除List裏的所有元素?不僅聽起來簡單(只是有個在刪除元素時元素下標動態變化的問題在裏面,有點苦惱),而且做起來其實也簡單(大話了,只是到了後面解決了後才覺得簡單的),得益於一同行問的“js中刪除元素時下標從1變爲0”的問題。
出現問題的代碼是這樣的(他的是javascript代碼,我用java的List模擬):
- List list = new ArrayList();
- list.add("1");
- list.add("2");
- list.add("3");
- list.add("4");
- list.add("5");
- list.add("6");
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i)+" ");
- }
- System.out.println(""); //多的輸出語句只是爲了方便看運行結果。
- System.out.println("------------------");
- for (int i = 0; i < list.size(); i++) {
- list.remove(i);
- }
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i)+" ");
- }
他原本想把所有的元素都給刪除的,結果最後打印出來的結果是這樣的,有些沒有被刪除掉:
- 123456
- --------
- 246
看看,這結果很明顯出問題了,對吧?本來想把所有的元素都給刪除,結果竟然行事不果斷,“斬草沒有除掉根”,悲劇了,還剩下3個( 我竟然會想到斬草除根這個詞,暗暗佩服自己。)。他一開始就思考到了問題的最根本原因,就是第二次刪除的時候,原本下標爲1的元素的下標就由1變爲0了,原本下標爲2的元素下標由2變爲了1,由此而做了替死鬼,真是冤枉啊,真是的。所以,2未被刪除,3就被刪除了(更何況本身List的長度也在變化,長度影響遍歷刪除的次數,這裏不贅述)。一直到for循環最後也依然阻止不了這場悲劇的發生( 該是幸運吧,總算有元素活下來了,但對於我們編代碼的就要受罪了),以此類推。
我的解決方法是這樣的:
考慮到元素下標每次都要減1變爲0(其實,我錯了,是元素下標隔1降1),何不如用兩個變量來控制循環?我就給了兩個變量i和j。i來控制循環次數,j來去除下標動態變化的條件,len解決list長度變化的問題。
代碼如下:
- for (int i = 0,j = 0,len = list.size(); i < len; i++) {
- list.remove(j);
- }
- 還有另一個“狗血”版本:
- for (int i = 0,j = 0; i < list.size(); ) {
- list.remove(j);
- }
代碼運行的結果是:
- 123456
- --------
結果倒是正常輸出了,可兩個結果,怎麼看怎麼不好。
但最終他自己想到了最優化的代碼。他優化後的代碼如下:
- for (int i = 0; i < list.size(); i++) {
- list.remove(i--);
- }
從這件小事可以看出,分享起作用了,他把這個問題分享給了我,我把我的想法分享給了他,而我們由共同由此解決了問題,找到了可行的答案。所以說,分享是一種好習慣。而且,我始終堅信,會分享、會幫助別人的人他註定會海納百川,也會有更多的人會體會到分享的快樂。