<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    silvermyth

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      1 隨筆 :: 12 文章 :: 1 評論 :: 0 Trackbacks
        對于Java集合中的List來講,刪除是一個常見的操作,但是也是最容易犯錯誤的地方,尤其對于新手更是如此。筆者在工作中也經常看到一些工作了很長時間的老程序員在這個問題上犯錯誤;在這里,我將通過一個例子,給大家展示如何從List中安全的刪除元素。先看下面的例子:
        假如我有一個List,其中包含了6個元素,我想刪除其中的前面4個,應該如何做;好多程序員不加思索,寫下了下面的代碼:
        
     1private void unSafeDeleteTopByCount(List list) {
     2        try {
     3            for (int i = 0; i < 4; i++{
     4                list.remove(i);
     5            }

     6        }
     catch (Exception e) {
     7            e.printStackTrace();
     8        }
     
        大家可以新建一個List,然后新建一個類在main中調用一下這個方法,看看結果會如何:看到了吧,程序拋出了異常,如下:
        java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
     at java.util.ArrayList.RangeCheck(Unknown Source)
     at java.util.ArrayList.remove(Unknown Source)
     at com.lpx.collection.TestArrayDeletion.unSafeDeleteTopByCount(TestArrayDeletion.java:59)
     at com.lpx.collection.TestArrayDeletion.main(TestArrayDeletion.java:26)
        看到這里,可能大家已經明白了;對了,在刪除的過程中,List的size發生了變化,但是index沒有變化,就會造成index>=size的情況發生,拋出IndexOutOfBoundsException是一定的。這還算好的,至少你知道有異常,但是還有一種更隱蔽的情況,如果你刪除的個數是3個,IndexOutOfBoundsException是不會發生的,但是刪除后的List不是你想要的結果。具體是
    private void unSafeDeleteTopByCount(int count) {
            
    try {
                
    for (int i = 0; i < count; i++{
                    list.remove(i);
                }

            }
     catch (Exception e) {
                e.printStackTrace();
            }
     finally {
                print();
            }

        }


    private void print() {
            
    for (String str : list) {
                System.out.println(str);
            }

        }


    List
    <String> list = new ArrayList<String>();
    for(int i=0;i<6;i++){
           list.add(
    "str"+i);
    }

    unSafeDeleteTopByCount(
    3);
       什么意思呢,大家可以看一下上面的代碼,如果運行的話,打印出的結果是:
        str1
        str3
        str5
       為什么呢,當我們刪除了index為0的元素【str0】后,由于List的size變化,index為0的元素會變為str1,而index為1的元素會變為str2,這時由
    private void safeDeletionTopByCountMethod1(int count) {
            System.out.println(
    "*********safeDeletionTopByCountMethod1*********");
            
    for (int i = count - 1; i >= 0; i--{
                list.remove(i);
            }

            print();
        }


        
    private void safeDeletionTopByCountMethod2(int count) {
            System.out.println(
    "*********safeDeletionTopByCountMethod2*********");
            
    for (int i = 0; i < count; i++{
                list.remove(
    0);
            }

            print();
        }


        
    private void safeDeletionTopByCountMethod3(int count) {
            System.out.println(
    "*********safeDeletionTopByCountMethod3*********");
            List
    <String> localList = new ArrayList<String>();
            
    for (int i = 0; i < count; i++{
                localList.add(list.get(i));
            }

            list.removeAll(localList);
            print();
        }


        
    private void safeDeletionTopByCountMethod4(int count) {
            System.out.println(
    "*********safeDeletionTopByCountMethod4*********");
            List
    <String> localList = new ArrayList<String>();
            localList.addAll(list);
            
    for (int i = 0; i < count; i++{
                String str 
    = localList.get(i);
                list.remove(str);
            }

            print();
        }
    于index為1,所以str2會被刪除;你可以自己去推算一下結果。
    如何解決這個問題呢,筆者在上面給出了4種方法供大家參考,最后給出了完整的代碼。
    *****************************************************************************

    package com.lpx.collection;

    import java.util.ArrayList;
    import java.util.List;

    public class TestArrayDeletion {

     private List<String> list = null;
     public static String[] array = { "str0", "str1", "str2", "str3", "str4",
       "str5" };

     public TestArrayDeletion() {
      super();
      list = new ArrayList<String>();
     }

     /**
      * @param args
      */
     public static void main(String[] args) {
      TestArrayDeletion arrayDeletion = new TestArrayDeletion();
      arrayDeletion.initList();
      arrayDeletion.unSafeDeleteTopByCount(3);

      arrayDeletion.initList();
      arrayDeletion.unSafeDeleteTopByCount(4);

      arrayDeletion.initList();
      arrayDeletion.safeDeletionTopByCountMethod1(4);

      arrayDeletion.initList();
      arrayDeletion.safeDeletionTopByCountMethod2(4);

      arrayDeletion.initList();
      arrayDeletion.safeDeletionTopByCountMethod3(4);

      arrayDeletion.initList();
      arrayDeletion.safeDeletionTopByCountMethod4(4);

     }

     private void initList() {
      list.clear();
      for (String str : array) {
       list.add(str);
      }
     }

     private void print() {
      for (String str : list) {
       System.out.println(str);
      }
     }

     private void unSafeDeleteTopByCount(int count) {
      System.out.println("*********unSafeDeleteTopByCount*********");
      try {
       for (int i = 0; i < count; i++) {
        list.remove(i);
       }
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       print();
      }
     }

     private void safeDeletionTopByCountMethod1(int count) {
      System.out.println("*********safeDeletionTopByCountMethod1*********");
      for (int i = count - 1; i >= 0; i--) {
       list.remove(i);
      }
      print();
     }

     private void safeDeletionTopByCountMethod2(int count) {
      System.out.println("*********safeDeletionTopByCountMethod2*********");
      for (int i = 0; i < count; i++) {
       list.remove(0);
      }
      print();
     }

     private void safeDeletionTopByCountMethod3(int count) {
      System.out.println("*********safeDeletionTopByCountMethod3*********");
      List<String> localList = new ArrayList<String>();
      for (int i = 0; i < count; i++) {
       localList.add(list.get(i));
      }
      list.removeAll(localList);
      print();
     }

     private void safeDeletionTopByCountMethod4(int count) {
      System.out.println("*********safeDeletionTopByCountMethod4*********");
      List<String> localList = new ArrayList<String>();
      localList.addAll(list);
      for (int i = 0; i < count; i++) {
       String str = localList.get(i);
       list.remove(str);
      }
      print();
     }
    }

    posted on 2011-06-08 23:28 Gavin Li 閱讀(7895) 評論(0)  編輯  收藏 所屬分類: Java

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 最近免费中文字幕大全视频| WWW免费视频在线观看播放| 久久久久高潮毛片免费全部播放| 亚洲伊人久久综合中文成人网| 亚洲国产成人AV网站| 精品国产免费观看一区| 亚洲欧美日韩一区二区三区| 特级做A爰片毛片免费69 | 97人妻无码一区二区精品免费| 亚洲成a人片77777老司机| 97视频免费观看2区| 亚洲精品一区二区三区四区乱码| 亚洲电影免费在线观看| 亚洲精品成人网站在线播放| 国产福利在线观看免费第一福利| 最新国产成人亚洲精品影院| 男人的好看免费观看在线视频 | 色婷婷六月亚洲婷婷丁香| 久久久久久国产精品免费免费男同| 久久久久亚洲精品成人网小说| 8x8×在线永久免费视频| 久久久国产精品亚洲一区| 国产黄色免费网站| 亚洲av色香蕉一区二区三区| 免费一级黄色毛片| 日韩视频免费在线观看| 亚洲国产精品免费观看| 亚洲国产精品成人| 久久久久久国产精品免费免费男同| 久久精品国产亚洲AV久| 亚洲成a人在线看天堂无码| 免费萌白酱国产一区二区三区 | 国产91免费在线观看| WWW国产亚洲精品久久麻豆| 亚洲真人无码永久在线| 无码精品A∨在线观看免费| MM1313亚洲国产精品| 亚洲午夜视频在线观看| 在线日韩av永久免费观看| 老司机69精品成免费视频| 亚洲综合av一区二区三区|