科帮网

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > Java集合类ArrayList循环中删除特定元素
总共48087条微博

动态微博

查看: 1406|回复: 1

Java集合类ArrayList循环中删除特定元素

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-04-07 17:33:15 |只看该作者 |倒序浏览
    在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。
    ! |6 E3 ?* N% |" z) U8 N0 Y% |1 Q
    9 y( M7 Z2 S! I" P8 I- _* Z5 H一种错误的方式:! v; V1 b: ]: ?% a
    8 {) J5 a6 J  X, m/ X
    <pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){  
    3 D. }* k4 \2 S7 F* I, ]: w! y, @+ n6 m) Z% N3 u: L: B! k
      if(list.get(i)==XXX){  0 c! l9 F# A! K6 r, X9 O
    ; B+ Q  @: S9 K+ W+ e
           list.remove(i);  
    ; Z# B* P9 J  ?9 K) [. p( e* f
    " c3 Z$ @1 ^; z. p0 B; Y4 ~  }  & {" \) D: J1 x# x

    * P* I, y" s1 |6 N. z} # S- ~6 e, x7 U1 Q- ~, e/ g
    上面这种方式会抛出如下异常:$ c. R0 T: v+ l2 o% c! G

    0 R. `; s! d" MException in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    3 G9 ^1 A7 C9 J    at java.util.ArrayList.RangeCheck(Unknown Source)  8 R( k5 e  j' u% O: t
        at java.util.ArrayList.get(Unknown Source)  2 Z9 N, X0 W- R) J% N# b
        at ListDemo.main(ListDemo.java:20)   N. P8 W# h5 o6 G
    因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。! ]3 z+ ~9 o9 {4 P6 D. v6 D
    - h4 f7 R& d( k2 g5 j0 t
    可以对上面的程序进行如下改进:
    * A, J; m* P) \5 n# A8 b1 O% b. C
    / ~2 R& o" C+ p; p, Yfor(int i = 0 , len= list.size();i<len;++i){  
    0 S  m- |6 ]+ @* G- w* k3 l( C8 k+ @3 o5 B) f3 N: S; w: n
      if(list.get(i)==XXX){  3 C% H8 H, H3 G
      e4 |4 Z4 \( v3 q
           list.remove(i);  ) N* x/ X% ]1 i
           --len;//减少一个  
    * M8 A8 ^+ ^! S# v5 v, P9 J8 F  }  , V/ R8 |2 J( U. J

    - x. m: P" q1 H} , ]# L2 o) T+ o  ^1 S2 {
    上面的代码就正确了。
    + m% e( ^: R7 ^" z* N) U
    - M6 Y0 O: i- S- M3 D1 P下面我们再介绍一种方案:& N& l2 a7 D+ X4 j2 T9 p9 }

    : |( n1 M1 j/ T; h; m+ M* q& j3 ZList接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。% M- z: S" @* X  e5 f
    % A) w0 V. c. V: T; E; X8 M
    Iterator<String> sListIterator = list.iterator();  ( B- E  u1 ]- d1 G0 w. d* Y- Y
    while(sListIterator.hasNext()){  * Z9 L- q: W" }" k! W
        String e = sListIterator.next();  * M% v/ \% h9 `
        if(e.equals("3")){  
    ( o: E$ g& V) |' F" Q9 f" B( l, e# T    sListIterator.remove();  / h( i  @. f1 p) M) F
        }  3 X5 j" G: U! T
    }
    : k: A" U6 a; ]6 ~8 i上面这种也是正确的,并推荐使用第二种方案。' `' U3 Q9 s% z1 M9 t; J5 t

    & b* y( D2 l9 L# }6 H, T5 Z, e两种方案实现原理都差多的,第二种只是jdk封装了下。1 `! ?9 F/ V$ p( u5 A
    : a7 f! D, U$ K+ s1 I
    查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。
      R" G, ]- c$ m* G/ R$ }+ s; I

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表