该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。/ M/ t; H; a1 L P9 b* D
AD:9 @: T$ w' ?: H' j: r, F5 R0 r8 M7 O: T
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
/ ~5 K$ B+ s, c) W1 r L) M, L. y2 `2 f4 _6 o0 r' J2 N
将一些删除方法做一些总结:
4 i `# Q; W! r3 A# Q5 W4 Z3 L0 i) Z' `% l% Y( A# t
/**
& z8 s; z9 x- K7 q( d. _9 D: t * 删除Arraylist中值为"c"的元素 / Y6 N) R6 D: v9 Y! s
*/ 9 |% @3 C: u% M
public static void main(String[] args) { ! a. k/ _# P2 v& q) B$ p0 C5 t
& {- t1 k# |8 z* g& b
List<String> list = new ArrayList<String>();
5 F f0 J* y7 c, ~+ o" O% E+ u' @% M% J. _
//"c"在Arraylist不连续存储 " w4 h. D& ~9 C, X* \+ ?) A- M/ j
/*
8 u% Z& a8 q5 A list.add("c");
2 z( p% x0 G* E list.add("a"); / h6 w! A/ Q7 D# a' i) F9 e. _
list.add("c"); # Y# s' r4 ]3 b* k) O. ~* F
list.add("b");
* d* l2 N2 i0 h0 _ list.add("c"); % f3 G" N8 }( O8 x8 Z
list.add("d"); ( v' X( J2 w$ Z j9 @. x7 g
list.add("c");
- M2 l. U9 n& Q! w7 I9 v */ ( }+ C) f! G7 m' C7 v; a& h
4 O% E( U! ?' K //"c"在Arraylist有连续存储 $ B' T) s, `3 ~7 Q# c; v
list.add("a"); " O# E2 N$ h' o1 ?6 W$ R
list.add("c");
: M# n5 x' C) |5 n. O7 I& N d list.add("c"); ; ^1 v: M, l( l# t9 \* W' V
list.add("b");
4 W0 i U! \( q5 Q/ w list.add("c");
9 K+ I% t) H0 `+ n list.add("c");
; W) s3 K0 c7 o3 P- ^, g( z list.add("d"); ! u8 W7 Y4 Y' y7 M0 c
list.add("c"); 5 n5 o- s0 X1 k/ a p
7 R1 {1 p5 y; I3 A$ C- O: h" y% f
//删除Arraylist中值为"c"的元素
n, U! g5 S* y) X; w2 x$ F3 I& a9 ?3 E- F" {
//有可能不能全部删除
1 M1 ]# F$ K- X5 _( ^+ Q6 l, |$ ]. z //removeListElement1(list);
: |, T B0 a1 k- [8 {2 Z# D2 D( G+ X5 a
& E& O3 s- z I# o L4 K //能够正确删除 ; x8 u0 l$ n. E/ Q4 {- v2 E
//removeListElement2(list);
7 x) P3 k4 e6 Y, H: `" ~5 C7 l) X/ C- w, @
//能够正确删除 ; V, ^; j7 S( ]
//removeListElement3(list);
\7 D, |1 ]4 \4 b3 U' [/ w$ b }
7 M0 k9 \, A/ H- n; X* M9 }) t2 ^
/ ]1 u f% P+ a2 ]/ u! w' c /** . n5 O" R0 t5 O/ ?! @- t/ V
* 删除list中值为"c"的元素 3 k6 c- i& _0 L) l/ h9 G7 z( E
* 5 M9 ?2 ?! g8 {9 \
* 这种方式: ( `0 n& c" e2 N6 j/ ?! U
* 0 j8 c; E5 L& x: V0 K' D) G; Q
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
% m$ o0 k: L3 ~3 \5 c! S0 o * 8 X: U" F( J8 \; Z: W# j" l
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 / e5 A0 z: W- u6 Y
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 % K8 Q' K4 ~, }
*/
* g U6 s2 q& ?* c/ r- b public static void removeListElement1(List<String> list) { + b6 [: |6 ~; n- b
for(int i=0;i<list.size();i++) { 9 P+ `+ L2 h- ] q [4 g; E3 m
if("c".equals(list.get(i))) { 0 q7 u( w/ b/ t: D. R- h8 q
list.remove(i); * N% d8 b$ B4 e) j
}
$ r* ?% D! @0 B8 C6 p) h } - B) w3 H6 h1 p8 ], w0 D- g( B
9 j3 t( ?( @6 [ } 1 [9 j T# j" F- u0 `, F
$ Y7 Q7 a7 x* K! ]
/** . D. i' ~) s+ J0 b& r
* 删除Arraylist中值为"c"的元素
| B# i. y% ~# z *
& O! c8 p% h. P* u/ p* C * 这种方式: ; O0 d- A; V+ a
*
1 y/ p0 O; r) d6 u. B0 | * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 / d, j4 z, |" G& `. X, r; S) |
*/ ( n4 s( V3 s* |0 u& K3 }% q
public static void removeListElement2(List<String> list) { , q! f9 E% U* l/ ~/ G+ h; d
for(int i=0;i<list.size();i++) {
& \/ m5 J$ ?) q( Q" z if("c".equals(list.get(i))) {
& h+ x3 ^) X n% D/ z, H) {$ H list.remove(i);
( N- E& \ ~& C3 U3 f0 j% x [ --i;//删除了元素,迭代的下标也跟着改变 9 `0 A' j2 D8 G! F2 w' R
}
6 W' I6 V1 c! ? }
3 v$ X9 w6 h- E* B } ) o, {6 A. h1 i" J
, v0 d( E5 D+ {7 Y /**
. b e6 u {# @( d1 L * 删除Arraylist中值为"c"的元素 " @' f5 J- v, Y4 X. O4 w
*
2 `' Z7 q4 B/ u" B4 N' `* C * 这种方式: / l* ]$ a1 {# ~. Z; H% W' U6 {9 x7 m
*
( D5 ~4 ^! }* y3 G6 W& V * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
6 @ a% i" j# L2 e" Q0 R * 8 O+ A% P; ]# J: c3 j7 {1 L& l" I
* 需保证没有其他线程同时在修改 9 _4 H7 ]& Y- _" x7 |7 n3 M
*/
, |9 P& }9 z4 p+ p n8 J& P public static void removeListElement3(List<String> list) {
& p) d" K, W2 |& l Iterator<String> iterator = list.iterator();
- q, Q( k. g, h3 m3 J while(iterator.hasNext()) { S. W1 Z& @" O# U
String str = iterator.next(); ! M- Q1 _" v2 k8 b( |
if("c".equals(str)) { 7 S$ J. [, b; L
iterator.remove();
9 x+ y. n! m8 u: f; B } * b S* I6 J; ~* ?
) G% i9 V2 [0 k4 P$ K
}
3 P8 V$ c6 R. v; ^0 S3 z' v } + s( u1 i, C1 \# K# S% Q
- k+ _. q: i2 t# B, n+ `
|
|