该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。9 O' X8 ~: e4 m
AD:
7 [/ _* _/ w: |# v. l/ I昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。6 H$ P* u/ |% c/ v5 t S" ^
: d; o* y9 T B4 q
将一些删除方法做一些总结:
4 p# c- I9 r, r0 }5 N2 w) e( }8 P+ y3 R' H, i! e6 J
/** 0 [( t( L6 S% U8 H. O8 A+ [
* 删除Arraylist中值为"c"的元素 : h+ ^2 V9 @2 {5 x0 u
*/ * y. B" p3 x7 o# {& b1 t
public static void main(String[] args) { $ x k/ ?% \( y+ u/ ^. p& }: K
: [& n& }% p5 B4 |
List<String> list = new ArrayList<String>(); ) C: d% i* ?! `: C: a8 y
9 M+ ?' X. X" y1 m; n9 ] //"c"在Arraylist不连续存储
9 F% c) u/ R& I* ^5 k: l9 j9 r /*
/ O5 j* m# u* R8 z) r' | list.add("c");
7 j$ s, I# X# B+ q. f; T+ o. ? list.add("a");
# u1 L, p: E- V9 @ list.add("c");
2 A2 c1 L* N" O: O5 k3 |' M list.add("b"); 1 F1 |: P+ m; \+ J, ^, H$ N
list.add("c"); ; U8 A, r$ H, w' ?8 \) t
list.add("d"); ) X* Y. N! L9 u) O8 K% t. h% ~( p
list.add("c");
" g1 B/ Z- b. H/ Q5 H# A */ 3 T8 ~, Q4 c3 Y. s) J& Q
/ `1 s& P/ [7 [; Z+ H
//"c"在Arraylist有连续存储 / I* X# z0 c* N6 d, H
list.add("a"); 2 A" N9 W& }1 \. a
list.add("c");
* q2 P' g4 L0 O, q# A* e list.add("c");
- o6 Y" N, R0 {8 p% ? list.add("b"); & x; h4 v& y+ W/ d$ v1 t" j5 q
list.add("c"); $ ]4 Q$ }4 U% y/ Y9 E$ z
list.add("c");
0 o) T1 g8 r5 O5 `; N* t( y$ D list.add("d");
" v; U0 h+ p: s! w, _ list.add("c"); $ _8 x, o; N! s$ A
5 C3 Z- Z4 ~9 q, \
0 p2 ^ j' n+ H& K //删除Arraylist中值为"c"的元素
# e( N8 B! E6 Q% t& L5 ]8 j+ l7 }* X1 h( U& w+ N
//有可能不能全部删除
" y) m: M/ } _9 ~) g n; Y //removeListElement1(list); 9 r$ }$ L, j$ r7 L2 L6 z
" ^: u9 j" [* q* }
//能够正确删除
- Q W7 z, S9 H9 t( w/ Y4 c6 m //removeListElement2(list); 2 p+ |8 Q& j8 @7 T
, j( \' T2 J) p //能够正确删除 1 h. I% O, A" Q2 B0 p7 s/ M5 S& k
//removeListElement3(list);
/ B. c# x7 z$ s2 A# G } 9 j) [' ~7 A- W4 _ U- D2 M
* X0 V0 a |) v8 q
$ a- Z+ Y7 P7 |. K /**
: w. S' ^9 ^6 J6 t0 v * 删除list中值为"c"的元素 ! X7 N& |; T2 t" O7 Q# R. o
*
) Q" }* N5 ?1 C2 W * 这种方式: ) @3 c5 d/ ]# l* r
* 1 c5 }) W* H3 f) u; o; J
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 9 ^! E8 c# s( m0 e" B* b
* 5 T- {) M2 T8 J5 |+ _7 J
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 - g1 u0 h( v5 z. c6 V: x9 @7 B8 V
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 3 s# W" j. I; m, @' L
*/ " P! y6 \' Y2 g
public static void removeListElement1(List<String> list) { & [5 V4 V! r- L' ?$ a# Z3 [8 z ^
for(int i=0;i<list.size();i++) {
, M4 P- Z' j2 l: N if("c".equals(list.get(i))) {
6 h: Q+ L$ o/ n4 Y list.remove(i);
' [. C. M% E0 d# { }
% \( g& E5 } k } , `( s" S! Y% s G7 e2 Z
4 Q& e& Z4 |1 S! h. S/ v7 Y } ' Q4 M) O: C: ^% I8 F0 L
3 \8 ` Y& _; ]4 o6 w* O8 O1 L
/**
, A# I' _, Q, q * 删除Arraylist中值为"c"的元素 4 x* a2 X& D% h: K0 q) ]! A; `
*
1 g# v. g2 t u7 n& U2 K4 i+ O * 这种方式: 0 l2 v, G: P9 ]5 q
*
$ {9 I9 S8 ?& ~ * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 6 H* p% O; q; y, P
*/
" C6 k4 U% z# w" Z7 ~) o public static void removeListElement2(List<String> list) {
+ N3 y0 i4 S9 w8 n& ~ {6 O for(int i=0;i<list.size();i++) { 2 e' W: L7 e) f) u. a
if("c".equals(list.get(i))) {
" }2 f6 c# n( a& h- L) _# e4 W list.remove(i);
& b0 n6 ]$ ?+ r" H$ k& d: f --i;//删除了元素,迭代的下标也跟着改变
2 ]& D" v6 ]2 e4 L }
, X& ^( q5 e/ u9 G* Q } ( Q# ~% o' H, J6 W- k1 b
}
% [. V/ D" R2 n. y ]
: w9 W% ]0 l+ p$ I$ Y7 l /**
$ J. L$ I4 [5 Y) B% C; p * 删除Arraylist中值为"c"的元素
" |( I8 x0 ^8 m) V M * ' i9 N' @; D) ~7 b& E. l% U
* 这种方式:
9 \4 u6 U5 z: y2 X' H [ * ) g l' n/ W/ g/ u' j
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
[% c/ I' W: l. r *
, l9 i; S1 b3 y f * 需保证没有其他线程同时在修改
$ o6 a# x% t/ F( u5 ?. m; p. u */
/ h# E/ k( a4 d" e/ M public static void removeListElement3(List<String> list) {
3 T: c; p, U* L2 h; m1 N3 D Iterator<String> iterator = list.iterator(); * ^3 W+ m* E8 P) O& M) B1 J/ J2 Z
while(iterator.hasNext()) {
4 t! X! Z* m4 @- x String str = iterator.next();
% ~; s0 y# \7 E8 N1 I8 V6 L if("c".equals(str)) { 3 y% S( T. I5 k+ t7 A/ W3 Q- ?$ w
iterator.remove(); T- T" d7 O5 c. ]/ l6 P- p2 P* `
} 0 s$ F. H/ e- R2 {2 G7 `, H
+ B- I" K ]7 J v4 L4 K
} - c c0 L, E8 d. U+ X
}
8 w; J% H7 ^& x d) u& s
6 Z0 Q! Z" V6 S! M |
|