该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
" ^* D% D' Q/ i& y4 e, RAD:
6 e8 h4 m; |/ {1 F9 H昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。9 \! _8 D7 u& L0 L
3 f4 Z- U6 w4 x: E( f
将一些删除方法做一些总结:
, W* d1 g7 Z& Z' a, R
0 @2 P0 e) }1 v) j5 |1 A/**
' [2 Q+ A1 x& A9 t* n * 删除Arraylist中值为"c"的元素
% M0 s2 i/ n# x/ h3 ]( C */
' _8 Z- a- S/ _3 Y' y public static void main(String[] args) { % R6 a( f# P* N2 R: x$ a
" Z# J! d0 q8 B! I4 n$ F( j* {/ c
List<String> list = new ArrayList<String>();
4 N! x/ U. I% v4 c1 `, C' q0 L. ^6 r7 L( [1 x" y
//"c"在Arraylist不连续存储
3 n& G$ L: v7 h: X+ g' S4 @4 u /*
T; B2 Y4 F8 g. y4 l0 D list.add("c");
! g6 h( L5 a4 Y' p% s& i list.add("a"); ( E. n. }# Z/ g) ^
list.add("c"); 2 q( e# N4 z: @# y7 G; g! n
list.add("b"); $ {# H/ ^( o/ t. j/ y* A
list.add("c");
8 F" |2 A: ~' f/ Q9 l list.add("d"); ) v" ^& m! Q& Z+ l z
list.add("c"); W S8 _% M; \
*/ - C) p" l S* R5 ^ U& G! b# F2 P, @( M
" l( w& P! F4 ?$ R. ~( k8 x" i //"c"在Arraylist有连续存储
' q% L8 {' t1 J8 Z- L list.add("a");
0 g6 g0 t: B1 o list.add("c"); % y$ G& a4 D1 v" y2 g5 Y. d. r
list.add("c"); 6 |7 H3 k2 K( d/ g2 P8 P6 O
list.add("b");
+ P5 w0 U3 o1 W2 k list.add("c");
, z4 `, V! ?8 m list.add("c"); 6 K% b& N) a6 S9 J
list.add("d"); ( ^! W; K$ G( N7 {2 k, g
list.add("c"); % x6 N& J4 w& d) E6 x9 P# S/ b
; {9 ^( l' U& t7 @' }7 c" P9 u4 `+ m2 v+ O; O
//删除Arraylist中值为"c"的元素 ) p, ^+ I% ^" X D0 u
- j3 L: ~2 f( ~1 z
//有可能不能全部删除 - r# Y2 }& p z1 b
//removeListElement1(list);
5 B* I8 Q+ T2 k# P) l/ g, Z" X9 N5 I1 o7 V
//能够正确删除 + l6 |$ w3 K& w6 h
//removeListElement2(list); ) J/ P N+ @+ o2 e. ~& B
+ i4 n! |# k( K+ v- x# Q; G, y0 p //能够正确删除
6 K5 J! |6 i/ w! z7 }, O7 t: M% K //removeListElement3(list); & K1 X3 v( _5 h# {# H6 B: @) J4 U
} / r7 s( T7 B: Y3 a. p
2 `" t( e" \; N" A- Q
V5 b- J# i" g& e /**
' z% \7 M/ |. v% D * 删除list中值为"c"的元素 6 p/ Y" [* T( e) F4 \( T
*
! N1 e! c: V# x * 这种方式:
& k z/ x: A2 h8 } d: u * + h; [ e" O d1 V6 |) B! B
* 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
0 b, \' [* [9 Y& M r" q *
* ]# i+ ]7 p4 e2 p * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ; i# {5 s: ~9 o
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
4 L0 k; c& i* y h8 b5 N */
' V% g$ ~- ~1 N+ f @1 N public static void removeListElement1(List<String> list) {
. ]0 e3 U8 E8 M: o$ v& @+ e+ r for(int i=0;i<list.size();i++) { - J2 s* r! `! M% D+ a% f
if("c".equals(list.get(i))) {
$ @, g5 ~3 U% |, B% E/ W3 V9 u list.remove(i);
/ k* D% t: ^" z$ M }
# d: c ]* Q3 m7 Y1 T9 Y } & S$ ^8 [7 I# R' Q$ n6 ?
& T+ ?0 f; N/ |; H
} 8 Z& q: m) S: k6 \% l
2 K) [# z2 R; V' G; m /** 4 [ O9 p, q' b" \. L' m9 [8 E; q
* 删除Arraylist中值为"c"的元素
0 s- t( k$ g2 D# q7 J * % ~, @" h3 }. l# e m0 ]
* 这种方式:
; P$ q8 n4 _7 r0 ^; S4 @, |4 C *
2 I) u3 _, F& j# {& U * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
0 |0 ^ ?( ?: X# [) q' H */
; y+ C- y4 `( N( y3 k( R public static void removeListElement2(List<String> list) { 6 i; s- O5 T% U, z' P
for(int i=0;i<list.size();i++) { ' E B p/ O7 A% n# Z B7 U/ E
if("c".equals(list.get(i))) { 9 s2 f% c9 [( h s' d* p7 V) r1 f3 f
list.remove(i);
+ ^, n9 s7 ^& D9 R/ F --i;//删除了元素,迭代的下标也跟着改变 - q5 N. p% L |' K1 V: i. @0 b' r
} . ^: q& B t% X
}
# O7 Y$ Y' W$ }. u9 l4 E } m- T$ x9 D" V, W
' `' Q) A- ]- h5 `) y# J /**
9 l; u/ |4 F1 g- p6 Y * 删除Arraylist中值为"c"的元素
' }0 W/ e2 X5 F9 n" h2 |: ? *
3 ~" a7 O9 f. `$ B * 这种方式:
, ?5 M' @' a+ h+ | i *
0 R* ?( q) \# n* m& x" x3 s. n * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
6 h6 R# K E$ H: E. \; y; C# {; U: k *
) P- {- q2 V n4 o * 需保证没有其他线程同时在修改
3 w, ]' @2 S! K8 f */ $ [' w! M* [$ a% y5 z: V' g
public static void removeListElement3(List<String> list) { " N: ~1 K2 O& ?
Iterator<String> iterator = list.iterator();
. r/ r( R. Y8 ^% E. r) D while(iterator.hasNext()) { 7 T" q2 C( k' n' v. U
String str = iterator.next();
+ ]+ Q h" j/ E) A" [ if("c".equals(str)) { . h' v3 k" ^0 q' [
iterator.remove();
2 o! m& p: W- b n }
6 |4 `' V* X0 m% Q+ T, S ~; ]/ H. b. T( f
} 8 k# R9 o8 S! ^+ X, B" K
} ' s7 Y `% J9 W
e! B- F9 l: n0 c- Y# S1 Y y/ k |
|