该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。7 i( i- T+ ]$ b5 w/ r/ h
AD:
) k8 N4 p5 D/ ?. O昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。) u1 \- p+ Y+ w7 w7 x
$ u, p7 r+ d6 L& a- n/ w将一些删除方法做一些总结:% H6 o d. A2 F$ m* D
\: E% A! D, g, U8 b, R2 z
/** : _, J! C1 t3 J6 h C; z& c
* 删除Arraylist中值为"c"的元素
7 ^& X- j# H$ z5 @3 ^ */ S* v0 f3 O+ @. d/ l
public static void main(String[] args) { ' U" p, s- ^) p. y- e* S
* A7 V9 D5 P4 w List<String> list = new ArrayList<String>();
1 L9 \% z* K5 l& |. V3 l: D+ B0 S- W: G$ n9 h
//"c"在Arraylist不连续存储 & x2 Y# ]/ q+ ]
/* ( r" m' f2 f# y* P3 V( {
list.add("c"); ! ?! d# j" F: t$ J; K
list.add("a");
1 D! B1 M4 a8 F, e list.add("c"); ! @$ x2 z6 N! M5 y; U6 }
list.add("b"); 3 z2 s3 w! J! @9 K1 M
list.add("c");
0 i3 g( I g* ?* B4 v9 @ list.add("d"); c$ J+ D- S, N: }& f) I3 p
list.add("c"); + M# A3 C {- Y Z1 X& _! l T
*/
/ V" s/ K$ ^( g( \' h F9 }1 F; j: n
$ `$ ]" \* o/ P. p3 d1 k. ] //"c"在Arraylist有连续存储 ( R5 N7 O# b4 b- M- q4 \7 A, g; F1 s# U7 V# o
list.add("a"); ! C" k1 b, o2 W! b
list.add("c"); * R y/ Q! ` {4 {
list.add("c");
% k4 e* S( `8 Y7 J list.add("b"); . a6 T7 j$ k& D0 g4 O3 a
list.add("c"); & l; H2 |- m2 K' ?1 N$ I
list.add("c");
) {4 [9 @8 Y+ w1 i5 X list.add("d"); 8 h; X3 I+ ?* [! B
list.add("c"); ( _& ~3 \+ ?$ g& |# Y* W' ~+ U
: t2 M% T/ }$ S* x D! i; W9 W* ?6 E2 d8 T' m# e. x" y' O/ _ `) p# d
//删除Arraylist中值为"c"的元素
) P" @4 E4 F/ M, [/ u! q Z
$ d o: C0 Q+ B* z/ U. E" A( s& o2 K //有可能不能全部删除
# e" `3 ?! g; x% r4 k9 Y //removeListElement1(list); 5 ~4 ~. X. w- d/ q
0 o8 k- x- U T& H6 K5 B //能够正确删除
* p; {9 A& h7 u" p0 X( l0 K; ` //removeListElement2(list); ! R5 j- R5 a1 J. `0 Z5 u6 o
: ?. P5 ?/ Q7 I1 U: Y* B //能够正确删除
# h K) P* C: S6 `4 Y6 E //removeListElement3(list); u2 ]+ L+ o! k1 |
}
+ i/ c5 g- ^( H- X8 i- i. E7 Z
8 O. R- m9 q* b* {" m4 B
/**
( e' J# v9 |1 f2 c$ O5 [ * 删除list中值为"c"的元素 + i4 g& o1 g3 @( b9 s# S+ q- c" M
*
' Z9 N$ x( J8 Z * 这种方式:
4 @$ {, t0 N4 G* R( x) H; E *
1 Q `6 \% G0 a9 _8 V * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
' s9 h2 x l' ]4 X" C8 }, } * ) M+ ]# s) M2 I {4 j
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
5 m) r) d* H: u, s6 z# y2 ] * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 - X2 G, h. R! ~" q, g" }/ E: Y
*/
" h, k1 f+ z2 L/ S( @# [ public static void removeListElement1(List<String> list) {
4 Z7 j3 e% Y, F/ |* k# ` for(int i=0;i<list.size();i++) { / A6 n& N# G# R
if("c".equals(list.get(i))) {
' Z6 r. D3 d# l+ L$ `' y [/ h6 I list.remove(i); 1 b4 h+ {# T$ ]* j" X* H, l
} 8 p8 v* ~$ B7 G: L4 q* L
}
! }0 b5 X0 z4 E* t, i p; S' B. A5 y; B2 U
}
' W! L6 \9 V& v1 L5 W2 H3 i8 `# F1 y2 \
/**
) P5 {: }% m9 I0 L2 N/ @ * 删除Arraylist中值为"c"的元素
" W, J% S" Z% i/ p * * l) S, S* @1 u
* 这种方式: % q# S# v, f( ^2 A
*
* j0 s% i- j% C9 S# ^# Q: n& O * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
\4 s7 q: t5 q2 [1 I! P */ ! I7 G6 Y9 }( m
public static void removeListElement2(List<String> list) {
- F6 F* S. e+ n3 q for(int i=0;i<list.size();i++) {
- F- j: i! a8 g, j8 \ if("c".equals(list.get(i))) {
9 F7 C g0 i& s/ _3 x- W list.remove(i); : ?' O/ w8 }5 ]- v4 P" X9 F
--i;//删除了元素,迭代的下标也跟着改变
6 g% A. X5 k [3 p. H' u/ I } / O1 l) Q3 Q- h6 o1 u$ H: V
}
! u1 e' \. n0 h" @- P } i' p/ T! `1 M; q) R. _5 n1 {: t/ S
: y* ?# [% ?: m" D( ]
/** 6 B# ~( A: Z4 g6 N6 `2 w8 d
* 删除Arraylist中值为"c"的元素
3 ~7 J, [8 w# f& h) y * - \1 [: y1 r, V6 S; }6 o+ o4 j. R
* 这种方式: 8 I5 |, X5 h) X; [
*
- Q* X2 K: W+ K, ]7 J' a5 b * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 + Y# f3 x& i5 a1 X$ \
* L. Y8 i; N" r2 G, k9 z% f
* 需保证没有其他线程同时在修改
$ m/ @, e, k" R$ {! ^1 T */
/ ^) L9 L! [, y5 F: W public static void removeListElement3(List<String> list) { ( Y# X& V: F) u' u3 c
Iterator<String> iterator = list.iterator(); . e: f! W' {; x& u9 v$ f I
while(iterator.hasNext()) { * S" R! ?9 P, F, M2 g/ V) H
String str = iterator.next(); 0 }4 r* p+ _+ ?% B p/ g: `4 A" e
if("c".equals(str)) {
! }: h+ @$ A/ d, r. o; v, ~ iterator.remove();
1 y( q7 A J' P; C, N } % m4 V& R, [1 l' L5 w4 B
H1 t# X8 y6 P6 R }
8 Y* ?6 Z% _5 h- x. S }
}) E3 p, [+ H$ M# ]* u8 a1 Q- O# E& D
|
|