该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。) S! Q) G8 c9 x% G2 }+ X6 x
AD:% s0 `% A0 D. v* p
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
2 q/ w8 S; C9 v; M U. @9 _- V" }" d0 r
将一些删除方法做一些总结:+ x5 ^5 ~# |- k0 C) P
7 E- s; N) l! j* Y& r, D
/** 4 N$ g& t8 d7 J' l
* 删除Arraylist中值为"c"的元素 5 N4 _9 {$ W: D3 k- \- @
*/ $ v. v$ h2 f$ a' m" h
public static void main(String[] args) { ' z" T0 y2 N( I4 e, D+ z$ M0 @
' y0 D2 [, i+ g; w9 L* m$ Y List<String> list = new ArrayList<String>();
3 A4 C1 |# T# K7 ~0 C4 U# ~* P0 f! J% A% f( P
//"c"在Arraylist不连续存储
`' X9 ^- k% [7 D) G$ |+ i$ l /* 6 r1 u4 V5 p" |6 z% x6 x; N
list.add("c"); ' z/ t1 i" i5 ?( m1 e |
list.add("a"); ' b# r: X$ J; t& \' O/ {3 p6 E P
list.add("c"); & z" B. l9 J, v" i+ u. u
list.add("b"); & P4 b( \3 K$ |5 ]: w6 U
list.add("c");
8 W, J) Y* V! }$ b list.add("d");
4 x- I8 i: X: e! t$ A4 e" `4 w9 s n list.add("c");
' X5 ]) J) R& @1 Q$ E */
9 ~) x: B# g$ X6 D
9 v% j7 N4 L5 t9 u" C1 i //"c"在Arraylist有连续存储 " \+ ^6 m3 X, V' i( [
list.add("a"); 6 R2 m9 L5 a6 _4 D' k" B$ |6 l
list.add("c"); 6 t' D5 B/ I5 ]1 N! d0 D
list.add("c");
' G5 b" ?# h7 x. U list.add("b"); 1 K* c6 Z* c& d! T6 | q0 H" R
list.add("c");
- h! v: X! x0 U3 K+ N. K& q& _) } list.add("c"); ) G; f$ h3 {$ C- ~1 z
list.add("d");
/ Y& u) o( _8 y# @0 e5 {: T list.add("c"); / p! ^' T v" _! W- W. C$ S' o/ E. \
1 s' E; p: l( \) X; r2 _: j1 `& C, z! j# `
//删除Arraylist中值为"c"的元素 9 q4 k3 M- ^. d9 O
9 ]; X2 ]! q/ F+ r# r s. F //有可能不能全部删除
) x8 I! L; x, P/ }* i, ?4 a, O //removeListElement1(list);
! ~0 m6 a9 y/ x/ ^" K
+ b/ H! f( \ i; w8 K //能够正确删除
9 B( `" X6 |: r: T, B& g9 N7 ?2 q0 V. d //removeListElement2(list); 6 W8 M6 {$ i) Y& X, n' g! R& l
1 c6 T6 N! M( g0 D" h/ M8 \ //能够正确删除
$ F1 n" }* S3 L //removeListElement3(list);
% X/ Z7 @6 S+ A; G1 T } 9 t t5 l" S- q+ M6 f/ L1 o
8 n2 V) g2 j& Y& T$ _1 M
/ j1 z$ e- n$ }
/** ; A4 w* E& i4 M3 o& g; t g
* 删除list中值为"c"的元素
+ q" v# Q4 y5 {! m( J' x! m * ! X1 |2 K7 p" O( \- L% r
* 这种方式:
( T# Z5 ~ x3 P7 d# Z * ( r4 ~, m* g. f/ j8 b" M
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
* [& }2 S; k3 H( _ * J2 D; G) j) n' \
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ( B8 {# J. F- I3 u
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
: w- g2 p% P _0 k5 W6 H( M4 x7 k c */
- ~, X! S5 K+ h7 O+ Y public static void removeListElement1(List<String> list) { 8 T1 T9 F0 i G/ o9 v% k1 f! U! L
for(int i=0;i<list.size();i++) {
* ~* r A! E$ V0 F9 t1 b) ] if("c".equals(list.get(i))) { + _* d& O3 E4 c* {* q2 w- q3 ?* Y3 Z
list.remove(i); " e( s ~( p4 {# T, j
}
0 _+ \1 R5 [3 N) J/ }8 J( Y }
6 k) \6 f6 b1 H$ j2 D. \6 R: h4 v; m% M1 t
} 3 y7 v* V; N9 X. {. {
' ?6 V# D7 v- o7 Z$ B% M /**
# V' i" H; r( [. V * 删除Arraylist中值为"c"的元素 ' G, E6 Q9 p4 ]
*
: N# j" Q. A& c( v; F% o * 这种方式: 9 N, g) z" Z- L! N6 s( s. J, Y1 k# k
* $ m, ^3 p% {' e/ @; I0 p7 D# J8 Y! P
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 ! i( i/ P' w0 E5 G
*/ % N' M8 K: q9 r, {" w2 T
public static void removeListElement2(List<String> list) { 4 N5 X( Z2 l/ n$ c2 {
for(int i=0;i<list.size();i++) { * T6 n5 O5 x& X2 A+ M- v- ]) z
if("c".equals(list.get(i))) {
- V% e! p+ J9 l n& K7 B list.remove(i); / D! J3 L1 [$ {" ^
--i;//删除了元素,迭代的下标也跟着改变 8 V/ k. J# G* f
}
* |1 V3 m4 \0 l% X }
4 y9 e: Y- \6 R; s& U) L }
4 G# d; G* Q3 w& }) h- A$ `5 P& Y" X; c6 }6 r+ K" _
/**
. p8 ^* k) b' x8 ?# f * 删除Arraylist中值为"c"的元素
# ~6 C& Z: l) x( p4 \* T& M *
: N3 I2 n; l1 o; f * 这种方式:
6 x- l. \) s) b3 @2 k- n* C" q *
- T% V; A. H* }) k0 u * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
. [3 _ N0 C, H: t& L *
. J; i$ k M$ @" k6 R, y8 w0 Z * 需保证没有其他线程同时在修改
* [. t! g: t+ @4 z# r2 b */ 9 s0 l" E0 @' R) {
public static void removeListElement3(List<String> list) { k& |5 M4 c# y n6 t
Iterator<String> iterator = list.iterator();
2 n+ ?3 G, s; P1 v. J9 S% { while(iterator.hasNext()) { 8 V' y' M1 V' O
String str = iterator.next();
* C* K8 b& a! n. _+ ]+ @% @ if("c".equals(str)) { 6 W8 g* H" m0 ?2 x3 k
iterator.remove();
3 Q; `. j; v$ j1 D/ ~ } 7 w# a6 \ r7 g5 V8 Y- s6 x5 n
8 p4 X3 A. h, X9 R
} 3 H. Y" d' o5 t7 E
} : T: C% n. R9 a3 V
/ l" w& z& ?. q8 {- S. d' r
|
|