该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。+ B) @/ c+ W m
AD:
# |) v: F! f! B3 I7 ^1 J4 `昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
+ g* }1 n W7 A$ Y# P1 {3 c$ B1 `% ^6 p: }# r; O# U
将一些删除方法做一些总结:+ c3 J/ w5 I7 s @( k2 O/ B* A* [6 O; C
/ ~; h, G' q. ]4 E/ b2 ]; h
/** 4 b5 q7 k. G9 ?/ ]4 r: G
* 删除Arraylist中值为"c"的元素 0 {4 s- k6 D7 X! }
*/ ! P4 L# z0 }4 p: c; D
public static void main(String[] args) { ) g$ N: x% ]1 t, u* D
) u$ q' }5 V! E1 L7 W! F! D
List<String> list = new ArrayList<String>(); - e3 z: t# q% \# ]* i9 W) j& C
6 F) A1 J8 D, f/ x //"c"在Arraylist不连续存储 & O7 v$ ]0 w3 M3 L9 \6 T1 F' |
/* # k, f! F6 S0 ~. t0 {
list.add("c");
- S# o+ ?! b7 o% Q$ r list.add("a");
- e6 ?4 v0 C; A3 `% Q: A) ] list.add("c");
( Z; W8 ?* j4 Q+ u list.add("b");
/ R: _. e) L/ {7 q% e2 q list.add("c");
! y$ _* u& l/ j- r* b list.add("d");
. @0 ~" J" l' o+ c* { list.add("c");
# \3 I/ g) T. y4 ] */
: z: F9 L0 u3 a" S4 d! _ U* U8 H) d8 `4 D/ @5 y
//"c"在Arraylist有连续存储
6 z/ i; C3 e" v7 G; v+ ] list.add("a"); ' _1 f5 X" D% |0 X
list.add("c"); ! f( U5 B ^: A$ U9 p6 I, o: d
list.add("c");
$ \1 B* g( D* `* W/ @( @9 r list.add("b");
! _/ |* R6 [2 e: a, F list.add("c");
, W% I+ e6 z" p' O1 M' H list.add("c"); - W, O D8 C# P
list.add("d");
. C/ ^" X& @4 S; f1 j! S4 ] list.add("c");
0 Q7 Q6 k: @* a
5 U4 I& g1 e) c6 c' ]2 A! V
9 D7 a8 `, f6 N5 S- } //删除Arraylist中值为"c"的元素 1 z& X- \' q5 U9 @
& ]4 E! E; @8 K" [" j% O6 _
//有可能不能全部删除 + h9 s, L1 o; U7 c; T
//removeListElement1(list); I: J9 m( F3 g$ N+ U$ ?
+ s9 ^. R2 D+ ^4 _5 R" [8 l8 L //能够正确删除
) \3 _! w/ Y2 J& y8 k //removeListElement2(list); 3 ?, y/ ~, L% M7 t
6 @$ o8 g; A$ J) m# n6 q
//能够正确删除 7 H- |/ r! K' U' e2 j0 M: i2 r/ |
//removeListElement3(list);
; y5 c. c0 B# \3 r } 0 |" y6 u3 c9 g" v% g) i d
- I4 @% V$ v) E i @' j2 p4 @) d. M
/** ( ~' t8 D! l) d% \3 P; T3 C o' ~
* 删除list中值为"c"的元素 3 f. R( Q) [- [4 }5 R' ^
*
0 e, |3 F% N' r7 \ * 这种方式: {% Y' }7 V5 N! K
*
9 d* v: K- J+ z * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
9 j0 n2 ?# O( n* [- }/ u3 { *
- m: k! S. _) f * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
# w; Q5 k* X0 D6 ^; o% E' N# J- v * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 8 i5 I V7 [2 A8 ^
*/
7 ^- c, k# O# w' g* G public static void removeListElement1(List<String> list) { 2 `! o0 R- U# p) J$ C
for(int i=0;i<list.size();i++) { 1 I I- t5 V; j2 ^+ e& O
if("c".equals(list.get(i))) { & i# m9 p: a$ b# r9 v1 w
list.remove(i);
0 w7 D/ ?+ A- |, h4 ] } ) [; C# ^! C5 E0 ^3 |4 k4 \4 u! N
}
/ {# f7 w6 _/ L! M3 o: W0 O1 ?
3 o3 D" z/ e: w2 u6 x } 0 _# b6 w" y- b$ @ G
$ Q; h( F/ p# Y+ c- Y$ C
/** ! \0 g* _; z; u! O3 i% e! r
* 删除Arraylist中值为"c"的元素 # R u( N3 t* {2 ]9 v% L
* : f0 D8 T9 M* ^6 B
* 这种方式:
L r, D) W) @& k3 D" } *
8 B, e1 Q' W9 ~7 }1 c% ?. i * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
, Q9 T6 X+ c# w4 E+ b4 Q */ 3 L. M7 ?- P) A" p
public static void removeListElement2(List<String> list) { 5 S+ O0 H. V8 s% `6 P d
for(int i=0;i<list.size();i++) { $ \: X1 ^" o5 I8 Y, o0 I
if("c".equals(list.get(i))) { ( z% I2 q# ]; u! {, }0 b$ T
list.remove(i);
' V# ?! r& g, x1 s7 K) f --i;//删除了元素,迭代的下标也跟着改变 t* `" o' d! T2 z5 ?
} / E E. g7 G. I/ }
}
' M {0 p( z8 H+ Y } 6 ~' w4 A( a, o( F$ Z! n
. U7 [! l/ k9 }" W
/** / `7 x; D% j+ g3 s
* 删除Arraylist中值为"c"的元素
2 l2 O& j1 q1 r * F- ]( [9 }4 S# v
* 这种方式: # K( l7 l. a4 ^8 T G3 _
* ' ~" Y. m) `/ c+ F! B. o
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 . {1 s4 H6 m7 n1 V# g9 `5 ]- A
*
/ a: A+ c6 j2 s/ t. W5 N& o) |$ K * 需保证没有其他线程同时在修改
$ [4 Z) @% [4 g" [+ }0 R" Q8 _ */ 6 O# Y+ J5 w9 f' V- O6 p! A3 Q( u
public static void removeListElement3(List<String> list) {
+ x6 w6 `7 m5 e1 O8 ~ C0 S Iterator<String> iterator = list.iterator(); 5 m- Z3 f" B% t/ `/ g
while(iterator.hasNext()) {
; g8 |# _' q- ]" D R I1 w' l/ J. O) ^+ V String str = iterator.next();
; J4 u! A6 ^6 x. g if("c".equals(str)) { 5 Q9 C. x$ g3 p$ C3 Q
iterator.remove();
$ d! R- l! \, l4 d! \, G7 f6 \& E }
* L" i: y0 k1 F& r
; d7 s( m. T/ K0 D } & d) J" Z& P a
}
* y/ T' f- [ ~1 b z) Q
6 {9 Q h) ?6 o. s& w# ~ |
|