该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
- P8 G4 s. Q0 U8 b$ NAD:
3 \6 a" M% V# g4 r: Z n昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。 F* i7 q. s# R. P. J7 p: W
. z* ~, Q& J& h3 e9 r) ~将一些删除方法做一些总结:
: Z! ^! q9 i1 T6 R% G. W6 u- ]' [5 T- [/ _8 ~- ?2 i8 I; n& I( c2 o
/** 3 J8 E$ z' G8 Q k' U
* 删除Arraylist中值为"c"的元素 ' p1 _. M+ I) g7 u; K
*/ " b! Q. o9 S# M q
public static void main(String[] args) { ) S/ W6 P4 W0 x. a3 w3 g
4 F4 b) |# `; t8 e& x1 g
List<String> list = new ArrayList<String>(); 8 ~8 J9 [" U2 d! q- {, X
. o! q& M3 l9 ^7 [
//"c"在Arraylist不连续存储
- r0 R. u/ g( B8 U5 f9 s2 K /*
- ?) T8 n4 s! R& H3 n3 h list.add("c");
) b, c# |/ a! n' x list.add("a");
8 b) n" g& _' b/ Y# w list.add("c");
! t/ I) w) ^5 r9 X! ?6 Y$ X list.add("b"); 4 q9 R# O C( N* ?' F3 L3 z
list.add("c");
g! l9 e1 | k: X7 y1 | list.add("d"); # @# |# V* w/ ^% N+ A
list.add("c"); ! \3 r, e0 ]3 \ c3 V
*/ 4 E% a/ d- z( k* ~( b
( V: \1 |; j0 ]* |& M: [/ a
//"c"在Arraylist有连续存储 ( s3 m' v* \" q5 s
list.add("a");
! @5 J) F- U& I" d S. o- g5 H$ Q list.add("c"); - S0 R* s$ ~; B6 i. Z+ T: l
list.add("c"); ( b1 \2 n; c7 ~5 ^
list.add("b"); " J+ D, C) R0 W9 F/ q. \% w
list.add("c"); - B- Y/ w$ e8 j/ \$ j, u
list.add("c"); ! c5 Y+ Y" C$ G0 g4 ^+ D) {
list.add("d"); - G% ?7 i/ v* Z& g
list.add("c");
& Y6 D% A4 ~8 v- w. t8 ~2 o( r( s1 `* N0 @6 l; o: u
7 u7 w) {$ ~4 Q" w# { //删除Arraylist中值为"c"的元素 ) T b* i, U% Z$ n4 t0 _
" e' }1 [) A7 b- D6 A //有可能不能全部删除 6 y2 v# o3 @6 X* [
//removeListElement1(list); ) O- S/ @) O) J6 E# ?
# h0 {( u& n5 f4 g/ {% _' L
//能够正确删除
2 Y. \( P. J# j3 l# z7 r% B# H //removeListElement2(list);
; i! m) i0 u" a* d: t8 v$ v7 v! c* V9 {+ q# ]
//能够正确删除
9 w! c; y1 w% v T6 A4 o //removeListElement3(list);
* J1 \ m) z% Z4 F: i* P } * u; Y, A+ D- s U' t6 k. ]: f) m4 Z# O
, u3 ~+ E, A3 F. J% _/ Y) z6 S8 B4 \# R; m6 \
/** - p. s4 x& ]( Y% x: Z% X7 G/ g. b5 \
* 删除list中值为"c"的元素
6 r+ P3 U5 z) e0 w; G *
( V3 U! D( j6 X, \9 a: \1 {1 j6 x * 这种方式: % X) |) L q" q2 }0 q
* 7 q; I' q% c/ r0 s' l/ m
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 _) m- D/ c2 _$ J4 h& y0 I
* * m% M X+ E# n7 }# ~6 I
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 . l. [* r( E: L* H
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 4 F, o6 X3 ^. @4 T
*/
* W4 B a2 x0 q: d+ R w5 j4 ~ public static void removeListElement1(List<String> list) { 7 y' {7 S3 S& X3 z& k
for(int i=0;i<list.size();i++) { : y5 a& ~* P' l/ j7 Q! v" l. v
if("c".equals(list.get(i))) {
) w r1 i4 g" P+ D* V; l list.remove(i);
" C% Q$ r3 P0 ]3 v3 h c/ A- T } - |9 ~' ^6 ~- R6 f( f, e
}
) c- |$ C6 C4 {$ g7 f2 I' W
' V( o4 F4 D% O( j3 Z }
/ {7 C- u4 O& J8 E# |4 a. e% V( b
/** % A* e; o. X* J0 g* a) m& g) n7 J
* 删除Arraylist中值为"c"的元素 & c& r. b r6 ?5 ]/ C- d# `! o
* ) d* Z. u X" e1 q
* 这种方式: & P. D0 I* D4 O5 d4 ?2 t
*
3 a( M c& ^ o" p" Z3 @ * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 / t( X3 Z' ^+ b: V
*/
, ]9 y0 [2 e$ n7 z public static void removeListElement2(List<String> list) {
5 H8 y* C5 c$ `% _7 ^! r9 _* r' e$ I9 B8 K for(int i=0;i<list.size();i++) { 7 p, j6 {, Q; K# D! E/ B
if("c".equals(list.get(i))) {
7 q# Q- M* Y& z8 M/ U list.remove(i);
8 F y) Y# ~: k8 }( G$ v --i;//删除了元素,迭代的下标也跟着改变
" n+ d4 P& u/ i) _ } 1 N" B4 ^# T! |6 K! T& j# ?
} / o1 N$ l9 v. Q$ f7 s4 H
}
6 A3 L% J- X' p; Z% j+ O k# S" g3 R% H# v: z. l! S
/** % C% G& @# j* F6 ]2 [9 u
* 删除Arraylist中值为"c"的元素 3 [8 a' o" I* G
* $ y: i( r6 B7 B: X
* 这种方式:
& l% t2 g. Q* G) _! i * 9 F3 H% P8 x. ?2 e7 x3 a
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
) J8 T1 e( k$ T1 x2 }" E6 s$ ~ * " u5 p3 r0 c: Q* n8 ^1 O
* 需保证没有其他线程同时在修改
- F1 k3 F- p' J) Q. G/ B/ ?3 r */ 6 u4 J2 G; [, V7 `, o
public static void removeListElement3(List<String> list) {
6 J6 S( u2 g3 _7 m' J5 K# S% c' H Iterator<String> iterator = list.iterator();
5 {8 [- e* G, J1 ?) M% ^& b+ s( u while(iterator.hasNext()) { ! }, T: @" @: c6 c7 G) `+ |! U! O
String str = iterator.next(); ( C8 O8 w' }6 i1 R+ }2 p
if("c".equals(str)) { 5 M7 x+ O2 I% A j: z( m4 M- B! W# i
iterator.remove();
/ v& K# m% y8 r, w" ` } * l2 K% r0 `& H, S/ Z/ M; |7 o
; }$ ^- S& g, T* e$ ? } + Z+ l+ b! I; U+ @6 S
}
! d( C% R# ~/ m7 Z3 k2 ~' V
' r' P/ h2 G- l' r% o |
|