该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。 o' L/ h6 t! @% x4 l# n5 q
AD:+ }( y# |5 a: d3 q9 I! c4 i
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。' e1 c, k5 B3 I, o0 _8 x5 y
, y- W2 I& ^% W1 B1 w
将一些删除方法做一些总结:
# e! z- c9 d8 C) h% q5 F' p$ a4 y/ x" ?, _6 _
/**
* |* B: w! K% F * 删除Arraylist中值为"c"的元素
' b# \" H9 f4 w) a* ^( \" M, Y& C */
" ^) ~2 m6 q* n5 z public static void main(String[] args) {
% \- p& n h0 S1 r8 k0 [! L } b
7 ^% v# z* f* s0 ` List<String> list = new ArrayList<String>();
# Y" X( O( V# ]0 n
6 R, J7 e4 I: M9 o //"c"在Arraylist不连续存储
) \" o9 Y7 [* j j% H /* 5 Y0 f5 W* H, o& b" {9 p6 e0 c V
list.add("c");
2 p+ }! Q2 D2 P list.add("a");
0 m6 [; V9 X7 V0 Z list.add("c"); * x' D, |( D' L
list.add("b");
. x; B( Y# a1 Q/ H1 _9 m& \! E M list.add("c");
5 _7 F- I7 }. D4 \& b' S8 c# G/ o) ^ list.add("d");
/ Z+ ` z) ]& S) h* K1 I list.add("c"); , Q: E9 g% C9 B; }* I
*/
9 S( Z3 J7 s, X b3 [! U! s1 I$ E% o: ]2 t1 \1 _" }8 w
//"c"在Arraylist有连续存储 9 y! B7 e" j3 k* a
list.add("a");
0 J1 O% c( h' H h) n list.add("c"); ; c: U& b" Z* [; v2 }6 Q" T" d) ^
list.add("c");
/ N3 `7 o+ b" @! k% W: x list.add("b"); $ F2 i6 Z9 H- @' t; Q/ K
list.add("c"); ' F7 ] S& i5 G6 v6 r3 w
list.add("c"); 1 L$ r3 T$ B5 y* r1 C, A1 M
list.add("d");
( |* F( p, ?% d, ^/ [ list.add("c"); 7 c0 F# `+ j/ _! `+ q, Z- d" R
" K5 v J7 K6 ^1 l* O2 h
' e% n1 P+ n% X' W+ P" }4 H //删除Arraylist中值为"c"的元素 0 z; N* F& w; R+ y8 n
) \+ k1 b1 ]! ?4 e7 j
//有可能不能全部删除 : y5 Z# p: \8 ~9 y
//removeListElement1(list); & N. n" z4 m, r4 e m
" }6 Q1 r! z) b
//能够正确删除 % p+ T" |8 ?% M; H: B) t0 f
//removeListElement2(list); 3 H" ]9 r% Z8 _" R; _
3 n: }: n7 |: ~
//能够正确删除 9 G: k! n( G6 S3 C2 C( @
//removeListElement3(list); # ]+ T4 V- Y# \0 _1 A, p# C# N" Q! v; E( F
}
6 R+ {' \( d- X- @3 h7 Z
# N8 |/ ?6 r3 \+ d
1 d! P9 L( Z# j" G7 L /** 1 f5 e" v/ w! q3 B9 U* e b7 E) y
* 删除list中值为"c"的元素
3 ~- F# @* p- x8 m * " Y% a9 o& @& F9 h. d
* 这种方式: * D6 |5 n. i1 }. M2 L; K
*
+ Q" o% ? I! e- Z3 E. ?5 ^& ^ * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
0 r* V/ G- U- c; b * ) f }: w7 j# J4 K3 {9 }
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 " p% w9 A% y {2 O+ @
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 ! V; p0 W$ S i4 P$ V
*/ , G/ V' V9 ?3 N3 z4 U7 u9 x
public static void removeListElement1(List<String> list) { 2 b2 P* i& A- _7 \( x; A% T
for(int i=0;i<list.size();i++) {
4 n! E9 G& Y+ I( E3 y if("c".equals(list.get(i))) {
' f# g) X9 X2 s6 M; K( Z3 R list.remove(i); , I% e; i) a) M2 ]7 U4 E9 J
}
7 L, ^) c# |6 w$ e, ] } * s+ ^% P. O( B2 V0 {
+ V4 l4 Z& c/ L, ?
} ; r9 ^- J" o! m% e: D* s
( y5 Z9 i2 t2 ]3 L2 s0 l /** ! v% G3 F5 p& V
* 删除Arraylist中值为"c"的元素 ( H; y9 M& o( ]
* : [( J. R0 n, Q: B( R
* 这种方式:
& ?! o4 p; R: R* y' f2 N @, R * : A$ D& L! {0 L5 u5 u
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
8 j; @' H- L7 o% ?- M0 i K5 w. `3 a */
* d6 M. }. A/ q0 ~ public static void removeListElement2(List<String> list) {
; h% M5 [% C$ |+ G for(int i=0;i<list.size();i++) {
! z) D. |+ n5 _8 H! _- ]( i3 B if("c".equals(list.get(i))) { 5 ?5 ~! \1 G# b1 O! L
list.remove(i); . ~% ^+ W. U# s E
--i;//删除了元素,迭代的下标也跟着改变
% D4 }2 w- G) e" @. V }
% }4 C+ n7 u/ s$ D T1 H } . p i! k5 O1 {5 l5 b: _
}
6 ^) C+ W, ~0 c1 {- _4 d* d# ?
/ s- Z4 Y8 X' U0 P1 y Y2 }) G /**
. Y n e" g7 C" h$ J, B" S6 R * 删除Arraylist中值为"c"的元素
7 s+ H. M$ i, o8 j# ` * : ^2 J/ A5 ?8 k/ v, B
* 这种方式:
4 V3 j3 _) z) {! Q- ^ * % r: Q; ~1 e, M/ n' e n) o1 u
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
9 n/ p. l8 R0 l9 d+ T u * $ T) g% `& t$ R" _1 A# x
* 需保证没有其他线程同时在修改
. S+ u; N/ n$ _ */
; @5 T4 g q: K- G) p9 p, q5 O( m public static void removeListElement3(List<String> list) { # U8 }$ s% j# ?/ ]5 }. U
Iterator<String> iterator = list.iterator(); 4 B1 }( K# D0 T( ^) Z- ~
while(iterator.hasNext()) {
# v3 g) Q9 j! ]- y) _ String str = iterator.next();
" `# L8 U7 c4 i [ if("c".equals(str)) { % e- E7 D2 }7 P* d
iterator.remove();
5 u$ r0 m2 P. C. _ } 4 l; W6 \4 }3 `% O) {
( ^- u9 O, ~9 S+ d0 [
}
6 u( @- L7 t2 X( x+ r* U } ! d! _+ Q, j2 ?
) A7 G% R1 O6 j! @7 W& {, f
|
|