|
该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
% V4 {; p3 |% n1 E" S9 uAD:5 @, Y5 G' S$ r6 Z
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。% I& j' T6 d0 c
, \4 }6 P) d8 s, ?( J- V
将一些删除方法做一些总结:- l0 U" Y5 v! x' d' I
) D1 d" [6 |1 |" [/**
% {2 a1 N# _ s* I& r' B * 删除Arraylist中值为"c"的元素
: U% P' |3 ]+ W9 x */ ( ?3 r7 _& h0 A1 R$ B# N7 z2 w
public static void main(String[] args) {
6 y2 _5 b" O+ W8 R, D: r" A' Y& d
. _/ I4 D+ T/ ~8 b, k3 B' { List<String> list = new ArrayList<String>();
2 j+ W0 u. n+ x' N, B9 P
1 y. W9 b8 S; H" G* S. |, Y/ x' e //"c"在Arraylist不连续存储 ! l5 z5 N( @ s0 W% E$ o& d1 w
/*
: d8 A" C; M: b: s list.add("c");
5 d: M4 L$ H; ?- i list.add("a"); & ~ @/ ]& w, {" |8 `# U) e K7 K
list.add("c"); 3 @9 k4 J2 _2 i7 m7 `/ K( r
list.add("b");
1 \5 U0 X0 v6 O4 I9 R7 {( V+ M list.add("c");
, w6 U& z% {. y- I2 \2 C7 {; X list.add("d");
* `0 |( X U0 g! `5 x list.add("c");
! L2 T# Q/ ~7 S }; Y" q) V */
- u9 V$ t$ K3 a5 o5 a
. R4 ?4 j5 M. D# u) r( ]) Z$ @ //"c"在Arraylist有连续存储
; ~( x. n+ k4 Z& X# N4 M list.add("a");
+ w! [/ |! O+ {6 i5 c# u. _ list.add("c"); 3 H( P* n* R' X+ P
list.add("c"); 1 P5 O6 i& p S, {; g" G1 [+ U
list.add("b");
) J& o4 Q3 [. | D" x list.add("c");
4 _) J3 ^- u& r+ ? list.add("c");
+ z, e f6 ]$ S. T& S) p' O( ^ list.add("d"); " m- I/ v2 k" U1 i: \
list.add("c"); 2 y" p/ Z7 S" W9 t
' q' W* o. J5 Z. g) O" \' h/ D# L" E3 W6 f: {( G$ s! a
//删除Arraylist中值为"c"的元素
# h; l9 d% ^: ?& E; }. j3 j6 z# d9 D- n$ H, }
//有可能不能全部删除 5 K) P" w! ]7 p* S( G
//removeListElement1(list);
( ]5 j0 ]2 a% z- d7 `8 o
7 L' ]/ M7 l: h+ m2 C; U //能够正确删除 : e% Y- s; m" U( N- `7 N
//removeListElement2(list); 7 u1 [7 I0 e$ p/ C" N3 r
( ~+ `7 y) a- ?% Q- W
//能够正确删除
# c: Y$ h! `$ ?- ^0 R* X" Z //removeListElement3(list); ) L7 a. @: T9 f
} 9 ?8 k* S8 l' P8 S
' ~0 i2 s3 F" ^# ~' R6 R
5 e$ f, C0 J# q! H9 Y: C% B /** ! |1 W( d. W2 o3 c% g
* 删除list中值为"c"的元素 & D/ [7 Y4 f! g1 f
* 3 L- p, e9 Q' k' ?
* 这种方式:
* b: }2 W9 X; c *
: m5 ]" e0 V* Y8 u- ]7 d7 N5 t * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
" | o' k2 `9 G) O. j9 Z" d * " @1 j, d, G" `( p
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 : u& s6 g+ j. X; l) q% Y
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
2 A$ d5 K3 O$ b- w9 I* v */ ! K! u$ G' y: }1 m' Y
public static void removeListElement1(List<String> list) { ' o+ h' t, X4 t% c- s
for(int i=0;i<list.size();i++) { 5 Z! T! ?6 G/ y, ]
if("c".equals(list.get(i))) { / }, ?& Q5 U% Q! V! V3 P6 z6 A8 C
list.remove(i);
1 E2 y& S9 K% e/ t- p: G2 ]" h } ' P k* L" t# O+ R I% @
}
3 M9 m+ p) w: j: c' G; z4 H. |- g4 Y' c0 I4 q; ^% k5 E9 `
}
V+ [! F3 {7 Q7 N5 W$ v B1 r% l9 V4 v0 p. S: V9 a: P
/**
9 H1 b5 u" D) K, @3 B$ c1 r * 删除Arraylist中值为"c"的元素
5 u: |6 L8 c6 v' r * , E, L7 k6 J9 y `4 D6 a
* 这种方式: 6 ? x3 y; R l8 V9 x
* . w n8 I% I: O* V7 R3 x
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
8 E- \4 _+ l4 u" S f$ f* H0 r */ * Y( P5 t0 J1 N9 d0 K: x
public static void removeListElement2(List<String> list) {
" o4 e& W! \4 ~8 b" I for(int i=0;i<list.size();i++) {
4 ?1 L4 ~. [; S if("c".equals(list.get(i))) { 5 d. Q( {4 G9 f' z1 _6 g% I
list.remove(i); 4 ?# |* d6 L$ F+ W. v
--i;//删除了元素,迭代的下标也跟着改变
4 u7 h- [7 [6 C( S) ]) S } 6 Q$ g: u7 x2 B( X
} 2 H5 O: w `6 u
}
}6 r& M- L* B/ T3 l0 I, w5 g. c) o: c4 o6 ^( z7 ]. y3 P
/**
. N* ~. G b7 _" ~5 \3 T * 删除Arraylist中值为"c"的元素 $ g7 j/ U" K Q
*
9 j8 f E0 i2 l( ^1 P8 X/ |. V: a * 这种方式:
9 d5 }; f- t2 u# o * 4 \5 u$ W- `2 F- P6 q
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 4 L3 v# g# i+ T' e% F' a! ~
*
. E; b2 h- I6 u$ a; z * 需保证没有其他线程同时在修改 6 ?2 R+ B/ Q3 A+ t; h- t3 N
*/ * O' a2 @1 h! s% P
public static void removeListElement3(List<String> list) { 7 E1 _- N. f* O, x2 V
Iterator<String> iterator = list.iterator();
: ]0 V9 V% P6 f* f% S' A$ M while(iterator.hasNext()) {
' t- I! n3 X2 A6 v String str = iterator.next();
/ j2 | k. Q2 @$ v4 W if("c".equals(str)) {
L/ M) K: _7 W) r1 {: X iterator.remove(); 3 N. q5 K- b) n) H, _ [
} + D+ g: {6 s- l) y/ k
8 n. [4 q( z/ g* @+ v9 G; c' i
} / y5 B1 p* C4 d: {, b+ U2 M, x
}
% G, M$ _% d) l4 w. ^" {
3 a* A, e9 q( [9 ]; ^: W |
|