|
该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。$ J0 z% V4 H w7 |7 m! {9 @- K
AD:( @( [* J' S* R f1 ^2 [
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。( B4 a- L9 Q; R* h
I* x4 u2 K& M4 E# p' s
将一些删除方法做一些总结:" \! |: p% j+ A6 }; F' X
0 x2 A, p/ @$ X4 K7 R4 g
/** , Z7 R4 g1 a. P# ]' [# H5 L! g) Z! z
* 删除Arraylist中值为"c"的元素 - ^1 v! u, u7 U" U% {* \
*/ : Q9 b5 E: c. `" L7 y6 s2 t4 a
public static void main(String[] args) {
! i# ^: u/ z, T0 ]) Z7 L$ z9 [$ y8 o `
List<String> list = new ArrayList<String>();
2 J2 ~* J1 J2 S @. {
. q; i" n* m6 z- M2 y //"c"在Arraylist不连续存储 - A7 _8 m( t9 u9 k; m/ c8 I1 r
/* , T! q) L& R( ^
list.add("c"); 9 K3 r( t# j! ~ O' ? E5 w
list.add("a");
( a) J% B4 }$ c+ ^( ?, K8 L+ ~. _, K5 j list.add("c");
: f+ E" J! ]/ X7 K/ G list.add("b");
# p [& d, ~7 B ~2 u5 Y list.add("c"); ' `/ [; k8 ]: E2 C' k
list.add("d");
" [4 d' V" r; n+ \5 _ list.add("c");
. l# F( d, l8 Y3 R) i9 {6 H */ ! @: [7 [. {2 V
6 A2 b6 K8 n) \. C4 ?# Y! d" ~1 ^$ w //"c"在Arraylist有连续存储
' t. P4 Z" X7 x5 e. \: A. w list.add("a");
$ j0 W4 D: Q3 |+ X list.add("c");
" q6 Y: m% G9 J* J- ] list.add("c"); % ]+ v5 @' B1 X+ S1 X- A) t
list.add("b"); 1 d& t* m2 g% B; }+ X5 ^, n% k0 f
list.add("c");
; R4 i C5 N; P) I list.add("c"); % [. U y9 q8 e1 f* v
list.add("d");
7 G# r5 h, ?: A+ H2 H! t list.add("c"); / K4 C/ U/ P8 T5 U2 u
1 B! x- s' o) |- C
2 J8 P, k/ `9 f# L5 c0 i8 z1 | //删除Arraylist中值为"c"的元素 ' d& |+ N) L* z( Q e
) [7 e+ k5 L/ p) ?. N //有可能不能全部删除 3 B) t) H) A0 ?+ O S
//removeListElement1(list);
8 t& B8 j" k! P, j& M* b5 G% ~: I- T& t% p- Q% Z3 V
//能够正确删除 8 a1 {) c! p/ X8 ` f
//removeListElement2(list); ( ]3 @& M( T, F7 O Q0 A
1 @8 e. Z6 W* ]& J2 i //能够正确删除 - }. u# S w9 o. [6 V
//removeListElement3(list);
; m7 n T" b% H3 _! o$ A }
: d. j; D$ j) n& _ j: L. \
9 z7 }2 N7 _, h s+ G* ^0 O8 X" p0 N9 C, w1 t9 l3 j0 p: S
/**
* @; ~+ A9 \4 R5 r0 X * 删除list中值为"c"的元素
4 |% K2 O* E+ x1 K9 P *
4 I' G+ O } p5 U8 c * 这种方式: ( o& _1 N) y' [) S/ ~
* . f3 H# o# D4 b! b/ i
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
! t+ A2 w$ L+ [* K/ Q *
0 \8 s/ o/ N0 z& l6 h * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 7 |/ | a# e1 A) a% ]2 R
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
+ A+ ?* d% [7 H' l3 B6 N: g */
' d0 N4 T1 w. ?% l0 Q: w6 ~ public static void removeListElement1(List<String> list) { . h$ Z2 v* a" L: D2 {0 U
for(int i=0;i<list.size();i++) { & f1 f9 T+ x* O% T" `, S; g
if("c".equals(list.get(i))) {
; G) t6 @2 `1 r, C; }/ z2 K list.remove(i);
1 X" A: ^. f$ }, M }
/ d: B5 e& D0 v* Y, a! p7 H( @ } F4 ]1 z7 C o# R
% C2 Z5 J* h( U( U- |8 o/ m7 Y/ {/ K }
( P6 k* |( j b2 y( {2 m% U2 p- T5 Y
/**
$ c' | O# H2 f% @ * 删除Arraylist中值为"c"的元素 : y5 m9 `% f) I+ }) D
*
; R$ Q1 J* q7 d* Q) _1 [ * 这种方式:
: C7 b2 }) \7 H * % w0 [9 i& a- c% _: r; ~( [, U2 k2 c
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 8 C, w/ ~6 k) m! j- Y9 ` Q% s# A
*/ 0 a5 V' f! r' @7 m% @3 w+ f* R
public static void removeListElement2(List<String> list) {
5 f; o0 _2 t$ F6 o* X for(int i=0;i<list.size();i++) {
( Z2 |# ~4 B% y8 j9 M- k3 @ if("c".equals(list.get(i))) { 8 \8 C b; I b, t8 m
list.remove(i);
3 D7 ?* V' Z8 o) M" e! u --i;//删除了元素,迭代的下标也跟着改变 1 a; R. B o' E) Y" m
} " Z; ]2 a' G7 p0 y" j
}
9 A8 K% h( j+ Y3 r }
4 D% M$ |; h% W$ A: t. R
6 G2 q4 P* o: |& q! M! A /** - _ R/ ?7 y2 N. q, K
* 删除Arraylist中值为"c"的元素 : b3 B3 |7 L- m% z1 m+ N6 a
*
C8 J y9 I7 u W1 A* b* t/ Y- B * 这种方式: & ?9 d1 i% X6 s3 b
* + P* o8 H; t4 J p
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
% z; R: \; d3 t6 D) | *
* w! Z! K. }6 r * 需保证没有其他线程同时在修改 ' {% d, v, w! e, ]
*/
4 r2 V: A5 V$ q: A, x public static void removeListElement3(List<String> list) {
1 v( A9 _/ V9 C! v, ]' q( ` Iterator<String> iterator = list.iterator();
9 [) O* q$ A3 ~! @) { while(iterator.hasNext()) { 7 q' g0 s! y; r( W/ P/ i
String str = iterator.next(); ) C/ b: R. D! k+ ^( w7 H
if("c".equals(str)) { " E/ z W- ?) Z j
iterator.remove(); & f# g+ p A$ x+ p! Q
}
% y( ?: b) m/ b2 z; E
- ]2 F1 v5 |/ n3 u1 s* t }
. S9 n- s2 U4 h1 { }
: e0 i, I- u$ a( F8 v8 d1 }) b# ]" P. v, Q
|
|