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

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

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

    silvermyth

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      1 隨筆 :: 12 文章 :: 1 評論 :: 0 Trackbacks
        對于Java集合中的List來講,刪除是一個(gè)常見的操作,但是也是最容易犯錯(cuò)誤的地方,尤其對于新手更是如此。筆者在工作中也經(jīng)常看到一些工作了很長時(shí)間的老程序員在這個(gè)問題上犯錯(cuò)誤;在這里,我將通過一個(gè)例子,給大家展示如何從List中安全的刪除元素。先看下面的例子:
        假如我有一個(gè)List,其中包含了6個(gè)元素,我想刪除其中的前面4個(gè),應(yīng)該如何做;好多程序員不加思索,寫下了下面的代碼:
        
     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        }
     
        大家可以新建一個(gè)List,然后新建一個(gè)類在main中調(diào)用一下這個(gè)方法,看看結(jié)果會(huì)如何:看到了吧,程序拋出了異常,如下:
        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)
        看到這里,可能大家已經(jīng)明白了;對了,在刪除的過程中,List的size發(fā)生了變化,但是index沒有變化,就會(huì)造成index>=size的情況發(fā)生,拋出IndexOutOfBoundsException是一定的。這還算好的,至少你知道有異常,但是還有一種更隱蔽的情況,如果你刪除的個(gè)數(shù)是3個(gè),IndexOutOfBoundsException是不會(huì)發(fā)生的,但是刪除后的List不是你想要的結(jié)果。具體是
    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);
       什么意思呢,大家可以看一下上面的代碼,如果運(yùn)行的話,打印出的結(jié)果是:
        str1
        str3
        str5
       為什么呢,當(dāng)我們刪除了index為0的元素【str0】后,由于List的size變化,index為0的元素會(huì)變?yōu)閟tr1,而index為1的元素會(huì)變?yōu)閟tr2,這時(shí)由
    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會(huì)被刪除;你可以自己去推算一下結(jié)果。
    如何解決這個(gè)問題呢,筆者在上面給出了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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线免费观看色片| 亚洲国产精品无码中文字| 国产99久久亚洲综合精品| 中文字幕一精品亚洲无线一区| 国产精品99精品久久免费| 亚洲免费观看在线视频| 免费中文字幕在线观看| 亚洲成人免费在线| 香港经典a毛片免费观看看| 亚洲av无码不卡一区二区三区| 波多野结衣久久高清免费| 亚洲免费在线观看| 国产精品高清视亚洲精品| 中文字幕亚洲激情| 中字幕视频在线永久在线观看免费| 一进一出60分钟免费视频| 毛片基地看看成人免费| 91亚洲国产成人久久精品网址| 亚洲美女高清一区二区三区| 日本阿v免费费视频完整版| 国产免费福利体检区久久| 亚洲乱码在线观看| 国产亚洲福利精品一区| 国产美女精品久久久久久久免费| 日本视频在线观看永久免费| 亚洲精品精华液一区二区| 久久夜色精品国产噜噜噜亚洲AV| 亚洲av无码乱码在线观看野外| 免费在线观看视频网站| 成人免费av一区二区三区| 久久无码av亚洲精品色午夜 | 亚洲AV永久无码精品一区二区国产| 少妇无码一区二区三区免费| 成人a毛片视频免费看| 亚洲av日韩精品久久久久久a| 亚洲成a人片7777| 亚洲AV无码国产精品色午友在线 | 国产免费伦精品一区二区三区| 亚洲高清一区二区三区电影| 亚洲综合色一区二区三区小说| 精品亚洲综合久久中文字幕|