科帮网

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 如何动态删除ArrayList中的元素
总共48087条微博

动态微博

查看: 3096|回复: 3

如何动态删除ArrayList中的元素

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2014-04-07 17:30:04 |只看该作者 |倒序浏览
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
% V4 {; p3 |% n1 E" S9 uAD:5 @, Y5 G' S$ r6 Z
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。% I& j' T6 d0 c
, \4 }6 P) d8 s, ?( J- V
将一些删除方法做一些总结:- l0 U" Y5 v! x' d' I

) D1 d" [6 |1 |" [/**  
% {2 a1 N# _  s* I& r' B      * 删除Arraylist中值为"c"的元素  
: U% P' |3 ]+ W9 x      */ ( ?3 r7 _& h0 A1 R$ B# N7 z2 w
     public static void main(String[] args) {  
6 y2 _5 b" O+ W8 R, D: r" A' Y& d
. _/ I4 D+ T/ ~8 b, k3 B' {         List<String> list = new ArrayList<String>();  
2 j+ W0 u. n+ x' N, B9 P
1 y. W9 b8 S; H" G* S. |, Y/ x' e         //"c"在Arraylist不连续存储  ! l5 z5 N( @  s0 W% E$ o& d1 w
         /*  
: d8 A" C; M: b: s         list.add("c");  
5 d: M4 L$ H; ?- i         list.add("a");  & ~  @/ ]& w, {" |8 `# U) e  K7 K
         list.add("c");  3 @9 k4 J2 _2 i7 m7 `/ K( r
         list.add("b");  
1 \5 U0 X0 v6 O4 I9 R7 {( V+ M         list.add("c");  
, w6 U& z% {. y- I2 \2 C7 {; X         list.add("d");  
* `0 |( X  U0 g! `5 x         list.add("c");  
! L2 T# Q/ ~7 S  }; Y" q) V         */
- u9 V$ t$ K3 a5 o5 a
. R4 ?4 j5 M. D# u) r( ]) Z$ @         //"c"在Arraylist有连续存储  
; ~( x. n+ k4 Z& X# N4 M         list.add("a");  
+ w! [/ |! O+ {6 i5 c# u. _         list.add("c");  3 H( P* n* R' X+ P
         list.add("c");  1 P5 O6 i& p  S, {; g" G1 [+ U
         list.add("b");  
) J& o4 Q3 [. |  D" x         list.add("c");  
4 _) J3 ^- u& r+ ?         list.add("c");  
+ z, e  f6 ]$ S. T& S) p' O( ^         list.add("d");  " m- I/ v2 k" U1 i: \
         list.add("c");  2 y" p/ Z7 S" W9 t

' q' W* o. J5 Z. g) O" \' h/ D# L" E3 W6 f: {( G$ s! a
         //删除Arraylist中值为"c"的元素  
# h; l9 d% ^: ?& E; }. j3 j6 z# d9 D- n$ H, }
         //有可能不能全部删除  5 K) P" w! ]7 p* S( G
         //removeListElement1(list);  
( ]5 j0 ]2 a% z- d7 `8 o
7 L' ]/ M7 l: h+ m2 C; U         //能够正确删除  : e% Y- s; m" U( N- `7 N
         //removeListElement2(list);  7 u1 [7 I0 e$ p/ C" N3 r
( ~+ `7 y) a- ?% Q- W
         //能够正确删除  
# c: Y$ h! `$ ?- ^0 R* X" Z         //removeListElement3(list);  ) L7 a. @: T9 f
     }  9 ?8 k* S8 l' P8 S
' ~0 i2 s3 F" ^# ~' R6 R

5 e$ f, C0 J# q! H9 Y: C% B     /**  ! |1 W( d. W2 o3 c% g
      *        删除list中值为"c"的元素  & D/ [7 Y4 f! g1 f
      *   3 L- p, e9 Q' k' ?
      *   这种方式:  
* b: }2 W9 X; c      *     
: m5 ]" e0 V* Y8 u- ]7 d7 N5 t      *   当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉  
" |  o' k2 `9 G) O. j9 Z" d      *     " @1 j, d, G" `( p
      *   但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除  : u& s6 g+ j. X; l) q% Y
      *   因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小  
2 A$ d5 K3 O$ b- w9 I* v      */ ! K! u$ G' y: }1 m' Y
     public static void removeListElement1(List<String> list) {  ' o+ h' t, X4 t% c- s
         for(int i=0;i<list.size();i++) {  5 Z! T! ?6 G/ y, ]
             if("c".equals(list.get(i))) {  / }, ?& Q5 U% Q! V! V3 P6 z6 A8 C
                 list.remove(i);  
1 E2 y& S9 K% e/ t- p: G2 ]" h             }  ' P  k* L" t# O+ R  I% @
         }  
3 M9 m+ p) w: j: c' G; z4 H. |- g4 Y' c0 I4 q; ^% k5 E9 `
     }  
  V+ [! F3 {7 Q7 N5 W$ v  B1 r% l9 V4 v0 p. S: V9 a: P
     /**  
9 H1 b5 u" D) K, @3 B$ c1 r      * 删除Arraylist中值为"c"的元素  
5 u: |6 L8 c6 v' r      *   , E, L7 k6 J9 y  `4 D6 a
      * 这种方式:  6 ?  x3 y; R  l8 V9 x
      *   . w  n8 I% I: O* V7 R3 x
      * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除  
8 E- \4 _+ l4 u" S  f$ f* H0 r      */ * Y( P5 t0 J1 N9 d0 K: x
     public static void removeListElement2(List<String> list) {  
" o4 e& W! \4 ~8 b" I         for(int i=0;i<list.size();i++) {  
4 ?1 L4 ~. [; S             if("c".equals(list.get(i))) {  5 d. Q( {4 G9 f' z1 _6 g% I
                 list.remove(i);  4 ?# |* d6 L$ F+ W. v
                 --i;//删除了元素,迭代的下标也跟着改变  
4 u7 h- [7 [6 C( S) ]) S             }  6 Q$ g: u7 x2 B( X
         }  2 H5 O: w  `6 u
     }  
  }6 r& M- L* B/ T3 l0 I, w5 g. c) o: c4 o6 ^( z7 ]. y3 P
     /**  
. N* ~. G  b7 _" ~5 \3 T      * 删除Arraylist中值为"c"的元素  $ g7 j/ U" K  Q
      *   
9 j8 f  E0 i2 l( ^1 P8 X/ |. V: a      * 这种方式:  
9 d5 }; f- t2 u# o      *   4 \5 u$ W- `2 F- P6 q
      * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除  4 L3 v# g# i+ T' e% F' a! ~
      *   
. E; b2 h- I6 u$ a; z      * 需保证没有其他线程同时在修改  6 ?2 R+ B/ Q3 A+ t; h- t3 N
      */ * O' a2 @1 h! s% P
     public static void removeListElement3(List<String> list) {  7 E1 _- N. f* O, x2 V
         Iterator<String> iterator = list.iterator();  
: ]0 V9 V% P6 f* f% S' A$ M         while(iterator.hasNext()) {  
' t- I! n3 X2 A6 v             String str = iterator.next();  
/ j2 |  k. Q2 @$ v4 W             if("c".equals(str)) {  
  L/ M) K: _7 W) r1 {: X                 iterator.remove();  3 N. q5 K- b) n) H, _  [
             }  + D+ g: {6 s- l) y/ k
8 n. [4 q( z/ g* @+ v9 G; c' i
         }  / y5 B1 p* C4 d: {, b+ U2 M, x
     }
% G, M$ _% d) l4 w. ^" {
3 a* A, e9 q( [9 ]; ^: W

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


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

2

主题

0

听众

148

金钱

三袋弟子

该用户从未签到

沙发
发表于 2015-10-15 13:49:40 |只看该作者
看了看  学习学习  哈哈哈哈
回复

使用道具 举报

5

主题

0

听众

316

金钱

四袋长老

该用户从未签到

板凳
发表于 2017-08-12 20:44:46 |只看该作者
不错不错不错不错
回复

使用道具 举报

18

主题

0

听众

2680

金钱

七袋长老

该用户从未签到

地板
发表于 2017-08-14 23:36:26 |只看该作者
不错不错谢谢
6 K; ]  g0 g( r2 r$ Y& G
回复

使用道具 举报

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

   

关闭

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

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