该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。" ?5 r# V. l; Z1 X
AD:
2 R; e C% K6 g昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
- m' h7 @, n/ m. X& G. t ]# S- j5 U3 s5 h1 a. S, P. s! s
将一些删除方法做一些总结:5 p$ P/ I& m. J9 U/ M( X' h
1 R) q/ a8 ]/ w$ }* E D0 r6 N/ a
/**
0 z4 k. R6 R0 x, c# [ ^5 Z9 `" Z * 删除Arraylist中值为"c"的元素 8 P& e$ C% p& P- _: j7 p
*/
) ?! i# j6 T" \ j0 e public static void main(String[] args) {
+ s# e0 O. u/ ~4 W( H4 {+ c) j! h0 D# F
List<String> list = new ArrayList<String>();
/ t0 l- D- W0 l0 c; g
0 J2 e3 p% \! a& H% f; N5 O //"c"在Arraylist不连续存储 1 A/ }: S R, X, ]9 }
/*
. q) A# z, {- q" ~2 b b$ M list.add("c"); & h3 w( V- |* E! G, x# ?
list.add("a"); - O4 G0 W: S, @$ y8 X
list.add("c");
& V' K q, W4 o/ Q& M0 N; } list.add("b");
: r9 L% R5 k: S list.add("c");
- K7 @& Q4 ]5 e& c list.add("d"); ! Y0 i o7 t- S$ I
list.add("c"); 0 j. \7 ?; a+ L' j. C
*/
8 B5 v6 Q# {8 [" h* M4 C4 o6 K5 {, ^/ _: J3 m0 ^
//"c"在Arraylist有连续存储
2 M$ s' K E- b) Y6 j list.add("a");
; k, h4 r+ r" F+ f3 S list.add("c"); 1 u+ m) O/ u; b, t
list.add("c"); . l2 R. d- h2 o1 _7 o8 }8 e% a
list.add("b"); ' B5 p7 T; ?2 _5 V
list.add("c");
! s) c6 L' _5 l& V list.add("c"); " i+ o. m+ }3 p& N# g
list.add("d");
: C0 u- L0 O1 `/ Y, J$ r list.add("c"); ?" w i1 s" a$ {. z1 n
' ?3 b) {' _( m; i( c
# ?/ J1 V( R# M6 I- `
//删除Arraylist中值为"c"的元素
- T- B0 Y! u. h& ? b) j% }/ l# O+ _4 Q
//有可能不能全部删除
- ^+ \$ q. q, X# v //removeListElement1(list); 3 D j/ {% T6 N4 u) ~, \
7 V+ a$ `: a, S, u //能够正确删除
# g$ C5 R! x' e4 w" T9 f //removeListElement2(list); 3 r( x4 V4 o% e0 Z0 U. Q% h
2 P# j$ w' M' M //能够正确删除
% P- y7 s T4 X" K" V //removeListElement3(list); 6 g: a% Z' C8 p$ d4 B( \
} 5 f) f( u& C/ L- F! w" Z
" N+ |1 \$ ^2 B/ ~ x& J0 U% R# P$ [& a2 H; O1 ]7 d. Y: i
/**
6 _0 M/ i2 K% h/ r$ U * 删除list中值为"c"的元素
& E- o% X& t7 P; B& _ *
b1 F, a& @, O& K" N * 这种方式:
" G3 ~) m; \' `8 N- k \ *
2 w1 R3 J$ t! r/ w/ | * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 ; u2 L0 b* ^5 j# c+ C) D
* 6 u h) X E6 @( f6 A# g" |
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
) u C# [/ I8 c2 f * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 * u7 b0 u0 u! d/ P6 M5 \# I
*/
: {( _+ M9 }/ x( q8 G: D" G public static void removeListElement1(List<String> list) {
3 c4 L" C$ j: y/ }0 @ for(int i=0;i<list.size();i++) {
2 y3 N1 P* e) T3 M& D3 V if("c".equals(list.get(i))) { 2 h2 M) y1 U, a7 m& y$ S1 o
list.remove(i);
Z9 {2 ?/ a/ M( ]8 @. g) B3 I0 N+ ` }
8 j# ]. r$ T/ R" t+ t }
f6 g8 U8 {5 m, E: U; N- X: g2 D) A1 g. o! d
}
8 u9 b- ?2 c. Q" k* M' p4 ~1 B- j$ N! V
/** & a* ?/ _' {! a' y& ^) s
* 删除Arraylist中值为"c"的元素
; [0 s8 e) _! u" r% ^- I *
. b' H; L1 d4 d9 `5 h * 这种方式:
0 o: A- t! F; b1 S * 4 ^# O: t/ s* r# s
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
0 x$ O" o, _; X; [) ~9 V, l- O4 k$ A */
4 L+ s( }' S/ q9 a public static void removeListElement2(List<String> list) {
" z7 |& l& l6 W' ` for(int i=0;i<list.size();i++) {
2 o. O5 Q9 Z- x7 P$ y if("c".equals(list.get(i))) {
+ X9 r, c% n5 y% u& t2 l; g list.remove(i); , Q- g8 N7 s, X
--i;//删除了元素,迭代的下标也跟着改变
M. L# J. v, Y; A } " Y+ c" H0 _# [8 L$ t, ?! n" l+ i
} / {: D9 z7 x. R1 B! K- p, t
} - ?& L! ?( A) r& E
! C5 Y! Q' z9 p0 I
/** ( w$ u# o6 z" H1 n k& p
* 删除Arraylist中值为"c"的元素 1 ^- N+ k" ~/ g
*
$ `, h! _$ b% T$ [0 {% F * 这种方式: ( n- o' l* T, y! V+ k9 @
*
3 r j0 Z |3 X/ f* G- G4 ]$ n * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
; x9 y2 X8 Z5 O; H. q6 r0 h * . x3 S8 L1 s! \% D* ^7 _
* 需保证没有其他线程同时在修改 2 S8 s" t6 }# _, t: p- d
*/ ) b4 H% b" S! X: X5 l
public static void removeListElement3(List<String> list) {
2 T! e1 G: G: V! {7 z' c2 E! Q# V Iterator<String> iterator = list.iterator();
1 D, d }) z9 P% o; J: G; J while(iterator.hasNext()) {
4 g6 R' c% q6 ~$ V String str = iterator.next(); 3 [; W, t8 x; }8 ~, A# ]" W
if("c".equals(str)) { 0 [4 i; ^! g& Z$ N0 C2 z- {- S' y1 ~
iterator.remove(); $ ^+ Y' E, a! X5 M7 q6 Y% L
}
& g) m( ]$ n. q; [0 \
4 o# X# l1 L% H) n9 i% b1 ~+ { } & q1 T/ O- \9 @8 a4 ]/ }8 w4 p
}
) U4 o$ K7 e/ l8 i4 @( I) n# V i0 p o. s/ p( s0 E8 P. C. c) c
|
|