该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
! L0 Z" q6 k9 Y, q6 JAD:
" }5 F% g! k& N% _( l昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。3 }5 i H% o8 f: o N+ F
# h. S; p& Y7 R% t, B将一些删除方法做一些总结:. i* E% a6 b5 x. L4 W# J3 z% C
( j- t+ D/ r( a( v/** . p2 p) K2 K, T0 J: B% E( d' t$ x
* 删除Arraylist中值为"c"的元素 : P/ E! ?( n4 o+ d$ {! X9 h
*/ 3 \/ g1 e% }: @/ S2 G& l
public static void main(String[] args) {
4 V7 }7 `- ^5 v9 a6 p/ D' L
. B& W8 X) G4 m2 \1 N+ j1 r List<String> list = new ArrayList<String>(); 5 }7 l7 S! A! w
0 t# i2 |$ [9 z) }9 K, R0 B
//"c"在Arraylist不连续存储 1 Z! P/ u3 u' b K( y5 P) b
/* . }9 N* J0 D- ]4 C: |$ b
list.add("c");
! n1 O v& K8 u* E6 E8 T list.add("a");
: g# d* d: u4 _: `0 C+ Y list.add("c");
I+ i _& D, P3 e list.add("b");
3 F8 J. {. H6 H) B list.add("c");
$ ]1 G; l& ^$ r1 @) Z5 O list.add("d"); # \5 {# k0 d" d+ u+ I
list.add("c"); % z I0 e8 ^4 W7 }( A1 o
*/
8 ^$ N2 N* u6 u+ Y* t
; T6 F0 Z. q' N% M //"c"在Arraylist有连续存储 $ V6 ?/ U8 q7 E2 b3 ]+ C- C
list.add("a"); $ r+ [# o# L s$ r: [
list.add("c"); 3 d( G' A/ [0 w J8 C4 V( ^: d- b
list.add("c"); ) {; m1 K6 X0 ~2 u
list.add("b");
( d3 R8 X3 Q) Q/ \ list.add("c"); $ D: d: q* a5 r. X9 |% m' |
list.add("c");
- v( ]/ |) L: o' C list.add("d");
( L( {4 B- ^! s# e, H3 M- X list.add("c");
# L* r! @8 r u7 _4 @! T- ^
6 f. U7 y o$ |0 S
% R- M) [( _6 }# ~( {5 \ //删除Arraylist中值为"c"的元素 & Y5 O& `: A7 V
/ S9 n+ J# N( y2 w8 y; m //有可能不能全部删除
" L2 V9 s8 D# d //removeListElement1(list);
3 z. o' w" Q; H# [) R0 h
# v( d+ H: j* J; H- W //能够正确删除
w+ a4 R. l) g5 |2 \ //removeListElement2(list); 9 F/ b' v( @. s+ ]
& b' A4 `; F; }! G0 s. f* F0 A //能够正确删除
* j* o* G8 M2 B5 g% J+ `6 m- D //removeListElement3(list);
9 k8 W7 }* X/ l4 S' A2 M3 O } 8 |# P9 l( V" V- Z( ]+ E
# c8 O) H! G0 m; v
' \5 D) ^# u4 e; M /**
$ U. v- y1 V) i$ K) n * 删除list中值为"c"的元素 6 n+ ^' n9 p. Q
*
% G: n( S' `3 V3 _ * 这种方式: 1 s2 i& d+ `4 X8 w) B+ n
* ; b& M8 ~" _4 ]. V
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
- Q9 M; f; e: n. x0 c* R# R *
/ H/ Y! o& ^+ b- T. G$ w * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
- H; |- t% K/ J( F @) s$ K! Y1 ~ * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 6 e. B# V- i0 u
*/ 1 E+ N/ r4 {3 J. R. j
public static void removeListElement1(List<String> list) {
d/ W( A( @0 Z6 e8 K for(int i=0;i<list.size();i++) {
u& u. P4 x- G2 |. N5 }$ S if("c".equals(list.get(i))) {
- S( u( `" e( T$ e list.remove(i);
& W/ {3 b7 |& c% ?1 y } ! w4 W" {/ U7 z; R/ O9 d; q0 f' w
}
, L c) ^5 _$ F1 s& c9 u8 _0 h2 o8 w B3 w4 V
}
9 x- O7 K2 h8 g" Y! |. b/ k; g$ g M2 ^# |! V
/**
3 d K! a5 A# c* S1 _0 b$ o' Y * 删除Arraylist中值为"c"的元素
4 u) J& \% O8 j * $ k9 C x7 ]3 T) S5 j$ a
* 这种方式: 6 c. o5 L+ f1 |- C) ~6 i
* ) P: A8 d3 A; \. Z
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 # X/ P! \1 X3 n* c' Z, l
*/
/ @7 Z% M% \; H: k public static void removeListElement2(List<String> list) { I8 p" l8 `/ x
for(int i=0;i<list.size();i++) {
+ Q2 N2 `& z; h7 F% S* A$ x# o* m if("c".equals(list.get(i))) {
4 f6 a7 x0 u L list.remove(i);
: t1 p2 j) Q( S8 \! q& l4 N: f --i;//删除了元素,迭代的下标也跟着改变 * w+ \, I- A4 T( U7 M
}
2 q$ ]7 i" E# x6 V2 {+ ] }
+ B& p; d0 J1 o: e2 o# ?: }8 y9 y4 S } V" b: w/ _; {. q3 H" n! ]
* g/ h, [) Z% A8 p7 i3 ^# P /** 4 X4 y/ R) s: ]3 h/ w
* 删除Arraylist中值为"c"的元素 4 K# Z& z1 O$ V& A7 J* U, M2 L3 R
* 1 U# R" h" p4 Y' i0 D0 g& H" I9 E
* 这种方式: 2 Q& ?$ b j5 x$ K" T
*
. q, ]- S) {% E4 ]# M; q& Y% A9 w * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
% Q7 V1 t/ e( R+ u *
6 a9 w% I1 t0 [8 x+ O, A! S * 需保证没有其他线程同时在修改
& V5 ]9 s$ N1 {' z5 b) ? */ ' Q8 z& g1 Q- y" \- ~. Y
public static void removeListElement3(List<String> list) {
5 n7 d3 X+ _/ B: l1 P5 Z+ Z7 | Iterator<String> iterator = list.iterator();
, w, d. c0 c/ v' o) } while(iterator.hasNext()) {
7 k/ ?' g, f) s9 T/ i- O: O String str = iterator.next(); - Y8 _9 L. A) Q/ K) c* h s
if("c".equals(str)) {
- |8 N( p. n) u/ O7 `5 o! t: v iterator.remove();
8 X* S# v6 e5 i4 l9 a; r1 p' T } " i% ?9 [( O4 H2 @9 Z [1 N5 S
7 e, D C( m, [) u6 Y; d/ P% Y" V; O }
& K0 K; y) q* l- q$ M* B } ! {0 z0 K5 d. V- r) W% O A
7 P1 A2 D$ s( O
|
|