该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。7 B7 e3 u! w% q! i, c
AD:7 p& H5 \5 {- \# \8 ~. V
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
0 Q" B4 d7 v3 U- `3 ? e' g
# F: |' L$ C, @- u" }将一些删除方法做一些总结:
" o1 B, i% X1 j8 k! s; G
" z" K% G8 w( M9 u/**
' s9 ~+ I6 O* m% r6 p4 R1 b6 B * 删除Arraylist中值为"c"的元素
# N1 ]6 M6 {+ u; F3 | */ ) G3 V) ?4 i6 s4 H6 J
public static void main(String[] args) {
1 H$ h' H9 V7 `: b
# L; T- R# |+ ~- b& | List<String> list = new ArrayList<String>();
# D! v* D5 s* b8 K/ D: z
1 L' E6 ]( R( ^% g) q0 N9 n" z //"c"在Arraylist不连续存储 $ Y, {; w' `! g i7 R; ~7 U* e
/*
# g5 ?. b* P/ }. K& F4 b- { list.add("c"); [" D5 W0 d: `6 _% m- D- B
list.add("a");
( e$ d1 u- ?( X3 T f2 i list.add("c"); " S" B! x! |5 W: b( T
list.add("b"); $ l: k3 \; {' {: T! r; [
list.add("c"); % F- ~4 j- O/ k( T6 G
list.add("d"); 3 g: W2 N7 h: q2 S I
list.add("c"); : Y- `! ~$ J" `, d) h
*/ , H' x: k0 K1 I
0 B+ t4 t4 w: l/ i/ L# l! ~3 J
//"c"在Arraylist有连续存储
' j8 g# Y, Q( F! A+ L list.add("a"); 3 M/ t2 R# k7 }, ?3 @- I( Z
list.add("c"); : b0 p+ o& l3 L# n
list.add("c");
! e% x- q; `( W3 l list.add("b");
* p2 X1 @% [0 m4 Y# v& ^- Q: e list.add("c");
& E( b; Y; l: H2 ?& T0 k list.add("c"); / A; ]5 @& c) Y6 I# y! q* t
list.add("d"); ' I _9 n* B1 ]$ ~9 H* P6 I# h- r
list.add("c");
" ?) p a& V2 r9 s: h2 I) q3 I( g( j$ a3 A1 C+ r* ^ j' v
* t( l( k1 a7 o9 g# t //删除Arraylist中值为"c"的元素
9 A; F N4 ]6 }6 v. @ e% ?6 i) {; X( w: r C& A9 v
//有可能不能全部删除
, E. h) }; P- y9 A# H //removeListElement1(list); }* A a9 `! L8 \$ q0 z1 l
* m* R4 i' k4 H9 J //能够正确删除
- G# |- \( d9 Y7 Y+ @; [7 U //removeListElement2(list);
" E g( @% z! V$ b. n
' s8 Q4 p6 M$ T9 [) ?/ { //能够正确删除 % H) P" Q1 r2 X' X9 {& l" ~
//removeListElement3(list);
# s6 E6 o: a! T1 K }
, s f2 M' F/ |2 n: h& v! a! ?9 B( m I2 i2 E
6 S5 w1 j/ U: R3 L /** " S6 F2 }! Z9 O5 F7 y/ i2 ?
* 删除list中值为"c"的元素 + e6 a2 s+ l% M, w8 b
*
3 }2 g5 M; m* @ {1 l | * 这种方式:
! `) D( a, q2 y6 ~- X+ p *
# T: g: G% f2 g4 ~* y1 j c * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 1 x& G6 E* O6 d' p8 f$ ~; j' G
*
& S* ]0 y+ u" K0 r! @* H: W: M * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 * ?3 o1 C5 k' _
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 6 H; Q j" e4 a4 J5 ?
*/
- @' K% S/ }1 P. W public static void removeListElement1(List<String> list) {
+ o# s+ p4 \: ?+ k3 N6 H for(int i=0;i<list.size();i++) {
( A7 B" t/ H P if("c".equals(list.get(i))) { 5 b# C- L9 r, H/ n" l, b9 e
list.remove(i);
! n" s4 \8 D+ L }
* ?5 F/ |/ d, q } # v1 V/ C3 `- _
0 d: Y% X' q1 O6 K2 T& C" p: m
}
, d3 Y7 w2 G; @$ P! W5 w4 s2 d# a7 T" M4 t2 R' l) a, C
/**
e9 R: }7 k; \. h4 u * 删除Arraylist中值为"c"的元素
) E% C# v, K& L' a# i * 3 U& X: l/ a6 j3 L
* 这种方式:
7 s* ?' y9 ?1 G J4 T& P *
$ |9 G4 k5 f$ R * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 / [1 x6 L9 d3 B. t- M
*/ 4 ]' q7 K( p% }5 q! F( K* h5 A$ m
public static void removeListElement2(List<String> list) {
. B9 S; j1 a8 L. P for(int i=0;i<list.size();i++) {
4 u! U& {1 a# o$ w+ d6 H if("c".equals(list.get(i))) {
; y1 A9 p6 P5 C: j. n list.remove(i); . L& p7 F0 |2 ^4 m" `4 F4 i; U
--i;//删除了元素,迭代的下标也跟着改变
' d( P& S6 Z9 V } % M2 C. \% I$ M3 q
} - T/ I4 a" r' O% k6 K+ f4 \* p
}
J/ B# W; u- p0 ?
9 k3 V) T* v+ s3 \$ z /** & s& c3 I2 x8 @( c! B8 @& g/ l3 V
* 删除Arraylist中值为"c"的元素 8 p4 w7 g) A, W+ V5 J% K& Y5 B1 |
* & m2 _# Y& U- `! }, c0 U7 F6 V- ]7 V5 L( z
* 这种方式: - L7 j7 Z$ T; p$ j6 X/ t0 h# {
*
; U+ U4 X7 X( K- O * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
/ d% h& v& m- v& U * / Y8 @8 F I W" |$ w
* 需保证没有其他线程同时在修改
' S- k; |. O5 _& C; H */
1 ^2 f, S: l% z, g: T5 V" O public static void removeListElement3(List<String> list) { 3 U4 J A1 d2 a o$ M# F( P/ i
Iterator<String> iterator = list.iterator();
, R. ?: I6 v( J( F' p) ^; g while(iterator.hasNext()) { 1 M+ \. K8 s, ~: i4 x
String str = iterator.next();
* g) \. i6 c; g if("c".equals(str)) {
; R. n/ v3 q8 }4 V5 p" a iterator.remove(); $ q3 V( s* f7 b3 G: J/ V; b, Q
}
& Y) }8 Q4 z0 Q4 d8 P" s) z) ^' U7 G' P
}
5 R9 r+ j: R% K" I& F } % G% u/ W9 s$ | i6 p$ E; e
/ r/ x/ w: f" C: P |
|