|
该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
& F+ N* h, T: o) J4 nAD:% L! Y- R, Y" G
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
0 p( K3 x8 b% F- C$ e# U# `5 [$ i
将一些删除方法做一些总结:
+ Q, y2 v) P! v# r$ u/ m- z! Q3 s6 ]' d( X# v8 G- K% s+ k
/** 4 m/ J* G1 E3 ~) y
* 删除Arraylist中值为"c"的元素
& J! S0 J1 a& Y, n */
& B' C% \" P$ A( y$ Q& u$ B( _4 ~+ M# o public static void main(String[] args) {
6 ?7 t* {! I# f3 t
6 ]: u4 U, p3 h7 w' G( I- p List<String> list = new ArrayList<String>();
+ a6 B8 ~1 X$ Z8 }
) a" J4 t- U( J4 H! t //"c"在Arraylist不连续存储
3 G3 q) D4 Y7 g6 z /* & y6 Y+ A3 k( j' z# D9 @
list.add("c");
' ?( c) c: i0 H list.add("a");
8 @ S# K0 |5 y6 `3 s' u' j list.add("c"); 2 f" C# e, h! `1 A
list.add("b");
# ?2 u2 D) _7 d# z list.add("c");
, j s) e3 B: _) a$ u6 V; j list.add("d"); : ~, x; S- H7 n+ L& H/ v
list.add("c"); " a2 I0 R1 z8 [% _5 H
*/
- s! |+ r4 ~5 C9 n. D. C! j4 m/ O/ f: n. }$ M* ^
//"c"在Arraylist有连续存储 8 \4 ^8 ^# P6 c5 g
list.add("a");
) a1 _0 A9 h* ^' ?4 b list.add("c"); * ]% K/ e% \5 R1 N1 h4 s
list.add("c"); " E9 A6 F, x7 K" _0 h
list.add("b");
& a) o5 |9 N* i! C: W list.add("c"); " f4 ?! O+ M; o$ B
list.add("c"); . f) A+ b6 V; g# e( C1 b4 I: D
list.add("d");
0 M n& [% k/ S* k+ E$ W# g list.add("c"); 9 O5 b( z; f/ |5 F- \! [
- X/ X* u' b y4 N3 A* [
9 w, v. J( A+ T" l. H //删除Arraylist中值为"c"的元素
& U* c& R; `$ r+ t$ S
! j7 g; s V7 c. y5 ^/ U* g //有可能不能全部删除 4 U; i& P) x7 b5 G& r2 _! Z) D
//removeListElement1(list);
0 O0 v% R3 e) ?. N4 j, B4 `/ l0 {
//能够正确删除
$ i' Z& G* p# n; Z" S4 `' L //removeListElement2(list); 9 V \ l+ T, g% b1 c" |! k
/ n* A. w) x, E7 H* Y1 x2 h
//能够正确删除
$ _$ [ d9 W2 I; r! ~3 d' p //removeListElement3(list); ' l; _5 c+ y# F2 K& a; h+ }2 K
}
/ @- c; m! P% f& t5 L" y& z7 t" [( w
3 d+ X! O" g8 v2 V& J [; N
9 E) V. U& v8 D G9 D /**
" f9 E! g' i r- e0 v$ i. S * 删除list中值为"c"的元素 3 @+ z- n( b: G; c# B
*
- R6 R* t- b7 _/ u; }4 e * 这种方式:
; P; g5 X7 ?, Q2 \! J6 x * # G. Y: ?( Q/ Y9 A# u1 q$ B( T0 u
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 , D6 b! z0 a$ F2 a" }
*
7 a) W/ R9 h- M1 d; d+ J; K * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ) _3 j9 y) j5 ]) p6 }
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
- ~8 E, `3 l% }5 ]* R9 E3 W */
/ F ~2 L6 ?; ]" a9 w. T: c9 E public static void removeListElement1(List<String> list) {
+ T; i- M6 ]( I for(int i=0;i<list.size();i++) {
7 S( r" t: @# _, s. g/ y if("c".equals(list.get(i))) { 0 }6 y& u/ J% ~3 D
list.remove(i);
& u( b% l0 Z3 [ }
/ O p W) j/ B }
) {+ ?9 E+ Z8 ~0 ~ N. o+ S7 R4 S3 e3 j3 ^. w6 C
} " V( W: \, ?* N
- g4 n5 k( ] Q" y/ g3 Y /** ; s, h8 |4 q, ~$ K" U+ r
* 删除Arraylist中值为"c"的元素
9 j/ [( @5 `( e- M7 c) v8 ?' m *
1 I3 i4 x4 q; I9 k8 {5 D * 这种方式:
9 M$ ?4 Q/ r Z, b *
" l! {7 a5 j/ m, { * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
3 F( e+ t6 ]7 k& |& M0 m0 n */ . h" X/ ` q9 M. Z; U8 w! q
public static void removeListElement2(List<String> list) {
) @+ j! o9 A5 h for(int i=0;i<list.size();i++) {
+ t7 K0 t) a" t* t) K" y _3 X6 | if("c".equals(list.get(i))) {
/ L2 ]9 z2 L8 h- d% X list.remove(i); 5 r2 F) c5 v" |$ [- i! o& Z3 Y' D
--i;//删除了元素,迭代的下标也跟着改变 ; l" e7 b! ~# k0 v$ V8 _- o
} 3 }& o8 m0 m* m ~6 Y
} 7 z# s8 b* w# {, `" F
} & \3 F2 T8 X% ~3 m9 b8 J( S
9 C3 C4 n$ _3 |; W, B /** + ^( \" p' J1 f5 Y* U
* 删除Arraylist中值为"c"的元素 " |8 r$ I; X: _* m6 b7 l( F
* . v5 X( f2 {, c) g. {
* 这种方式: 7 }# _% v+ T3 W2 E+ ?
*
4 K/ J' O5 J( m! ~ * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 - o: C( N3 Z) ~" X5 j
*
5 \) ~% R' \$ g7 ^' [ * 需保证没有其他线程同时在修改
& k) b: J7 e+ D/ B */ 5 s. p7 t0 M% M( E' w3 y8 l
public static void removeListElement3(List<String> list) { 5 V5 Q4 p2 S7 U1 C1 J* F
Iterator<String> iterator = list.iterator();
- N8 [, q- H7 m" d5 E* E while(iterator.hasNext()) {
/ g: H+ E+ A9 O String str = iterator.next(); , b. _+ A5 {! t4 ]. w
if("c".equals(str)) {
" [3 ^& c6 S: C" N' a' J, o iterator.remove(); % ~/ o, I( E; d; u% J6 r$ S
}
! c8 O l' {3 P" f
0 c$ I, e% J0 A/ i/ A; Z6 x/ } } $ h" }5 a2 p9 y0 K
}
7 c. }5 {4 O" m7 `3 X* H
b: e2 t) T# f( `, X" _/ [ |
|