|
该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。5 u" i$ d5 ^6 r. z! @) v s
AD:
* X! s2 w9 y. {7 D* w! V4 j0 d昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
. q) I8 B7 h: t& C8 ^5 d+ F% M
7 U2 J3 k6 a3 l' S- r: l' o将一些删除方法做一些总结:
& U8 y4 s; a* {+ Y- Z, v8 C; G+ [6 _8 U. W- h3 X5 l" E/ i8 @
/** % ~" ^) c- ^" @0 P1 @
* 删除Arraylist中值为"c"的元素 + E5 Y% M7 W3 N* c' E
*/ & e' m& s9 d, ^2 m5 q% j) g' A
public static void main(String[] args) { ' n+ Q$ @/ l/ ?! b: {2 @; S" ]
- o' F e( R) R% a" j" q. f6 M List<String> list = new ArrayList<String>(); ) M/ o$ R8 W1 U! H
: l9 K5 C9 O* t8 J
//"c"在Arraylist不连续存储
: f0 X- a9 L' F. [6 p: q. j& b: u /* * h' [. N) n2 x9 J6 m
list.add("c");
! W4 G5 f0 [8 W list.add("a");
' J( J: O3 w% A# J k list.add("c");
7 E( I, b& d: t list.add("b");
# j. d6 N/ n; S9 o! g+ r" g+ N list.add("c"); ' V. d9 b- P w7 _+ X, q
list.add("d");
$ B) @$ @) x6 \' q9 W5 Z list.add("c"); & [, `. n# {( K N2 V4 z
*/ ! s$ ^4 D6 w+ Y, e3 q
) u6 J2 ?# f8 l3 v/ b* _* u //"c"在Arraylist有连续存储 ( X! P/ ^- M8 n8 T
list.add("a"); 1 T1 k% }8 W6 t' i
list.add("c");
' t k/ o- ?4 t& ^8 g list.add("c"); / ]; ^. C! C4 w1 a
list.add("b"); ( V5 G2 Z' B" j6 x) t2 K2 Q, U" {
list.add("c"); & L, `( j5 \- Q% P) J; q0 N7 J7 a
list.add("c"); , g9 H' p* y) s/ r
list.add("d"); 3 V k% \* l: a0 D
list.add("c"); % W4 F. h1 J# M; E2 p2 [) N
7 l# F e: y1 v( ?$ K ?: p: W) Z$ b# G4 z: c7 t* S- l5 N
//删除Arraylist中值为"c"的元素
4 w5 ^ c% c/ @6 ?( ]) ^% _" D
, B* n: W0 J1 E6 p$ O5 I //有可能不能全部删除
* X; z* S& T% X: Q, C% R5 n" ^; g //removeListElement1(list);
5 ~" ?' h% R9 [. R% i
, A0 s5 o+ U. U4 K //能够正确删除
; B7 E) k& g! D2 m //removeListElement2(list); 2 p: l) S8 _ }; h
7 Y3 s1 m: q8 T4 I( T! r //能够正确删除
* F/ @$ P$ o. L6 @1 L //removeListElement3(list); # {! X& n9 _; a! ~& J
} 7 \8 M/ S2 ^+ ~
0 k5 V+ l6 u: \7 z# x% D1 F! [: E: f7 y7 ~, f/ P1 J
/**
. \7 [/ E7 p; K" `' m1 S: T; A * 删除list中值为"c"的元素 4 V4 h+ X Y$ t2 E3 G! E) [+ n8 o6 `5 C
*
% U/ j( i, m v1 ^5 E' J6 v& j: y0 H * 这种方式:
7 P$ H/ M. y+ s; |9 P4 g! D( T * 4 d: x- w, A( s7 Q2 e
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 1 R6 s' t# ]4 D. \& A0 c6 t' j
* 6 ^0 n+ @4 d) r1 ]' y
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
4 c' F- c# V2 i% i( y% i" E * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 : N& t0 J( R& @$ y
*/
- l3 b( e ]9 B8 L public static void removeListElement1(List<String> list) {
! f8 N# j2 m1 ^6 r# k# o for(int i=0;i<list.size();i++) { - k# S/ ?7 V$ L+ |/ q
if("c".equals(list.get(i))) { . J. \- H8 U: B& \$ {; t: P* _
list.remove(i);
4 C/ m2 z4 z% L! I$ Q* x } 3 a1 _+ q1 H: S
} $ i# ~# Z) d- B t( u& ^5 F$ c
- q Q0 _' h, A; y7 e; Y+ X& [+ d } + I! v: X$ Y& V& L
# G; n5 g" N$ L7 q b/ J( ~
/**
3 t- _- y- k" V5 I! x8 p, i * 删除Arraylist中值为"c"的元素 ; }: B3 T5 r$ M, K! T* r
* ! k9 J) @( a+ k A+ b- y" o% C
* 这种方式:
: `4 m& R2 w/ v* e8 n: Z9 ~, m * : Q" [" d9 i' f/ e5 f
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 ; M" Q, k3 W' _7 T- e6 J1 v
*/ , L: P' e7 h- ?# p1 H" h3 q
public static void removeListElement2(List<String> list) {
9 a, c# }/ T3 T1 _% v for(int i=0;i<list.size();i++) {
! ^( u& t$ |3 o" H& B; u) \ if("c".equals(list.get(i))) { 7 v1 d6 J9 e0 \0 R
list.remove(i);
/ L! K( a \) B/ }8 p z --i;//删除了元素,迭代的下标也跟着改变 s; T: n+ i, Y' h
} 0 v/ k! g) x) [1 M, n1 a2 Z
}
5 H$ R6 c- P m+ U- w }
4 A I/ b7 H8 w" G9 S g( V1 v4 v G9 i) t+ n
/**
3 n" }( t; M' d/ w6 G8 Q * 删除Arraylist中值为"c"的元素
5 E7 T6 F; B* r' d0 {# C* M8 h& G *
8 g* q3 s4 X% { * 这种方式: 5 x* { Q* h# x. n. {5 G: p' W" {
* 4 }; @3 A% v- y- Z
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 ' O6 @- i" Y' ]/ R i
*
7 i+ d5 w! S6 c" a B7 P% k * 需保证没有其他线程同时在修改
" @! |$ ^9 N7 r( K5 a+ l7 R */
3 g; `# h1 @+ [: R4 M# g% _ public static void removeListElement3(List<String> list) { % n6 q2 F i# K, f# E6 A. }( H
Iterator<String> iterator = list.iterator();
+ y0 J4 b- }; A: x while(iterator.hasNext()) {
. Q& o+ U4 Y' F# B; W* d String str = iterator.next();
4 ?+ t v$ c( \# E if("c".equals(str)) {
O$ t1 l: m( \2 Y' f iterator.remove(); " `6 W6 m# B; k B
} $ h+ Q" b* N$ h5 `
5 K( _6 w' z, A. R4 n/ X* J2 g% [
} / G( F) Y" U9 t$ L% I5 y
} " X) J. p. d0 x
3 h* b: r3 b4 d5 a3 N" g |
|