1. 程式人生 > >List的迴圈條件刪除及迴圈刪除重複項的解決方案

List的迴圈條件刪除及迴圈刪除重複項的解決方案

目錄

1、List的迴圈刪除滿足某條件的項

  • 1.1 問題
    List刪除某項的時候,一般可以使用list.remove()方法,這在不迴圈的時候是可行的。但當涉及到迴圈刪除一個List中滿足某條件的項的時候,使用普通遍歷會出現刪除不完全的問題,使用增強遍歷會出現報錯的情況,如下示例程式碼:

    普通遍歷刪除:
    for(int i=0;i(<)pairList.size();i++){
    PairPerson pp=pairList.get(i);
    if(pp.getCulmulatedTime()<30){
    pairList.remove(i);
    }
    }
    //小於號加括號是因為mackdown語法不熟悉,不知道怎麼寫程式碼塊
    //刪除會出現跳過多個滿足條件的項導致山和醋不完全的問題

    增強遍歷刪除:
    for(PairPerson pp:pairList){
    if(pp.getCulmulatedTime()<30){
    pairList.remove(i);
    }
    }
    //會報ConCurrentModificationException異常(網上有說第一元素的刪除成功,第二個才報錯)

  • 1.2 處理方式
    使用Iterator迭代迴圈並刪除滿足條件項,可以完美解決這個問題

    for(Iterator iter=pairList.iterator();iter.hasNext();){
    PairPerson pp2= (PairPerson) iter.next();
    if(pp2.getCulmulatedTime()<30){
    iter.remove();
    }
    }

  • 1.3 問題原因分析
    使用普通遍歷的方式當刪除一個元素的時候,其後所有元素的索引都會有變化,以ArrayList為例,刪除一個元素,其後所有元素的下標減一,這就會導致往後遍歷的時候漏掉下標減一之後變成剛剛刪除的那個元素下標的元素,即,刪除下標為3的第四個元素,下標為4的第五個元素下標會減一變成3,迴圈繼續的時候會漏掉這個元素;
    使用增強遍歷的時候,需要考慮到其底層的實現機制,具體可以去網上查,這裡不做解釋,其結果是在迴圈過程從List中刪除非基本資料型別以後,繼續迴圈List時會報ConcurrentModificationException 錯誤;

2、List的迴圈刪除重複項

遍歷刪除重複項有多種方案可以選擇,這裡寫出兩種:

  • 2.1 移植
    基本思路是遍歷一遍將所有的不重複項拷貝到另一個List list2中,將原list清空,再將list2中的元素新增到原list中;這樣的做法很簡單,但演算法比較笨,所以在涉及到大量資料的情況下,效率不容樂觀,具體的實現可以在網上找到很多,這裡不再做示例;

  • 2.2 使用雙層兩端迴圈

    示例程式碼:
    for(int i=0;i(<)fourPairPersonList.size()-1;i++) {
    InteractionPersonNumber ipn0=fourPairPersonList.get(i);
    for(int j=fourPairPersonList.size()-1;j>i;j–){
    InteractionPersonNumber ipn =fourPairPersonList.get(j);
    if(ipn.getPerson()==ipn0.getPerson()){
    boolean identical=ipn0.getInteractionList().containsAll(ipn.getInteractionList());
    if(identical){
    if(ipn.getStartTime()==ipn0.getStartTime()&&ipn.getEndTime()==ipn0.getEndTime()){
    fourPairPersonList.remove(j);
    }
    }
    }
    }
    }
    注:這裡程式碼裡面的類名之所以比較複雜,是因為我直接把我的原始碼拷貝過來了,讀者可以不用收到列表名稱以及類名的影響,代之以A,B,C…因為mackdown自動排版的關係,所以程式碼看起來沒有層次感,希望不要太受影響,理解其思想即可,重點在於for()括號中的i,j的設定。兩端迴圈可以保證留下所有重複項裡面的一個元素。