该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。5 X- L" D1 q# a- U6 T7 H: X! F
AD:
1 [5 D6 ~9 Q4 M昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。( L- [* U% f$ z1 D: ~. |/ k4 W/ C
/ i6 ^4 m& w( R
将一些删除方法做一些总结:$ s/ n, }+ K/ K* B
# X& a$ S; x \- y/**
: ~% f/ I8 r Z; N7 ]3 w. E# p * 删除Arraylist中值为"c"的元素 0 R, w$ U5 A+ L/ `% S5 R2 d
*/
2 M, x$ I5 i. ^, @: g# D; h ^- i public static void main(String[] args) {
" ^$ e7 W" z7 |" S+ F* p, M. L* ?7 i3 R5 K: ]; v; p+ k& {: h
List<String> list = new ArrayList<String>();
/ J9 I* y( u# p. G0 }! l3 l+ q* d5 G# _
//"c"在Arraylist不连续存储
+ F& C& @9 G F4 Z4 U- u+ Z' y! d$ E /*
) Q- C9 `# v& g7 e list.add("c");
! _/ X4 c# D' X- J list.add("a");
9 ]2 z6 ^+ z4 @8 x list.add("c"); % R/ |% d, \( u3 x
list.add("b");
; t" _! _5 O: h* d1 c3 p list.add("c");
y( W0 h: O& D0 A list.add("d");
3 a# i; G/ r) M- [( N! `& `6 p list.add("c");
8 v% S$ C$ G& o: X- t# H */ 7 ~0 }0 U" x3 P# r, U3 [
' y3 f( p" `6 r3 ?/ ] //"c"在Arraylist有连续存储
# b1 z: U0 @+ U, V0 E list.add("a");
: N% |2 |% U7 o s list.add("c"); 0 F( C9 s0 U& }( i" ]+ b
list.add("c");
, u! {: y! [1 p list.add("b"); ' L p& x+ p, A
list.add("c");
: E" ^3 _; _2 p+ a3 A0 F N Y list.add("c");
( Z* C$ b. c3 z8 {+ W# {% @& t% i list.add("d"); . A5 w7 v; K. z' i! |- j) r7 x$ Z
list.add("c");
+ w) i$ o; t2 ?5 o: P9 C ?4 r3 K0 m6 L8 N9 v4 O
/ A+ c* P- z! C7 k
//删除Arraylist中值为"c"的元素
0 ]1 G( Z; b, x$ y& h% s; _9 F8 J6 L, d& o4 t1 j& {8 R
//有可能不能全部删除 # K% ~1 [' T; a. j$ b6 `! ^
//removeListElement1(list);
, q0 T' K# ^+ {" M) a+ k6 @1 S9 i+ l, K; i5 _" d2 g
//能够正确删除
9 |, G/ G, j9 S7 ^2 }& e3 M //removeListElement2(list);
& ], E5 g8 H# _- H: {3 S0 q/ E0 F- u/ R" _
//能够正确删除 ! Q4 b: u, O2 K2 B, @7 T
//removeListElement3(list);
) I7 {7 @% D% {( k3 c& d, a } * o! C0 R, o7 @* D
0 D [7 U0 G/ A: B, J
% y" g3 C) N$ v /** 2 [9 C6 w8 q M4 d
* 删除list中值为"c"的元素
8 L$ {# X f; `, v: @ *
* V) O2 u9 v& r. D/ b9 [4 O * 这种方式:
( F7 N, x) S1 A" B- c( t* g * % S' W% V6 U# K& D4 Q+ o- p9 [
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
, Y8 z) c# t r) D3 j *
9 Q$ E/ n6 @5 H3 z* c * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
8 `" x; {9 _' l * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 : O* j3 [# y5 n
*/
' ?0 b& X+ p! O5 i ` public static void removeListElement1(List<String> list) {
) `$ Y3 o( ^% O7 C for(int i=0;i<list.size();i++) { 4 J. T, p$ Q: a m0 k% L' Y
if("c".equals(list.get(i))) {
7 P% a+ y" c1 N4 ?+ D$ U3 J list.remove(i); ( @2 P8 i& X4 ], j9 x
} * `. E6 I6 l7 D) O& } n9 O
}
8 h/ w1 x% |; P, D; y3 y+ L$ i$ I9 q
} 8 @5 B! `: P/ v
7 \+ O% [' M9 f' e: P5 r /**
& h; J7 n; K/ J# N) Z * 删除Arraylist中值为"c"的元素 1 I; k) J. v( z
* ) f) O2 h2 e0 p; ]: k
* 这种方式:
# q2 W5 Z) h. n7 L* t/ G* F *
: E8 ^& N4 Z. H' f. E8 u9 Z4 j * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 7 k" C1 Y8 ]8 o1 Q3 G1 K
*/
' ^( R1 @- W8 R9 _ public static void removeListElement2(List<String> list) { - p7 ^, M5 Q8 {4 t5 b' j
for(int i=0;i<list.size();i++) {
2 d( I6 D0 s, o if("c".equals(list.get(i))) { 5 Q5 o- G! H8 l3 t7 f
list.remove(i);
5 q- R- ?2 R; p --i;//删除了元素,迭代的下标也跟着改变
$ o. W) W5 f4 y4 @. G }
3 A( _( e) R' z% x, E& m; ^5 ^ } & z( i* h3 R' |1 t* j y6 _- x
}
+ v# a% A4 m. s4 N9 i! K. k2 ?" i5 f N- n- P6 m
/**
- U0 @! S) D" i7 }" _ * 删除Arraylist中值为"c"的元素
4 L9 A7 r4 U% C; @ * / l9 k7 [# o* I1 G
* 这种方式: # z8 ~+ k, K6 R- T0 [' p/ A
* 8 n% n7 D' E, f; K7 n% \
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 6 R& L# s; S! i: x, j
*
$ b: m- \. O! ^0 _# W, ?2 [9 P * 需保证没有其他线程同时在修改
6 l# f! }0 e2 i& n */
2 o! `7 M6 u) \7 w! g0 r public static void removeListElement3(List<String> list) {
& m# z. l {8 | Z2 t& K; ]; d% q Iterator<String> iterator = list.iterator(); - X; C8 }& P1 Z( `; B2 N( L
while(iterator.hasNext()) {
# u) N8 C' @5 p: ? String str = iterator.next();
1 a# a- }9 y9 C. K- m if("c".equals(str)) { ) U, U+ j8 y6 o4 x, H7 @ T
iterator.remove(); 9 ?+ S; V7 {0 D+ Q# w
}
) B4 ?4 D5 e" ~% b3 k9 c
4 @9 `. h5 N4 M* B' b( Y/ R( D: j) f* E+ B } - J+ I1 M& N* `0 h% X; Y! ~
}
. J! s! W5 A' Q0 M
- D0 o B+ b* Z% @; I |
|