该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。6 u, Z V% F! ?: k. V# }- s$ J
AD:
( c# J7 q+ T0 j% r# q& H+ \% m昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。* m. c& {6 l( O: V* G( h: b6 F
6 N5 V5 R/ J" i+ M8 q5 ~2 z- w
将一些删除方法做一些总结:% y6 P! |. i, ?' l
) F8 p9 \, |" n) e& M6 x R. r/**
# g$ d4 s0 I9 k, e8 Z% R, s * 删除Arraylist中值为"c"的元素
" y9 ?" x/ i* s) q */ ! d4 }/ [% A0 [ W4 A
public static void main(String[] args) {
1 r' s) _& E1 h' g, y1 g) ?" j
: g& b6 a! G2 T/ s! a9 a! h List<String> list = new ArrayList<String>();
6 C! K6 r$ u l2 }/ V& O# D+ v' ]4 z0 s
//"c"在Arraylist不连续存储 + R Y% |+ c+ }* C% |2 f+ Y
/* , n1 G- f' N U) j8 k
list.add("c");
/ D" Y4 R4 s. `( l list.add("a"); 2 O6 l3 j' m7 |0 _7 y$ t
list.add("c");
- s- f- f) W% |: D5 L list.add("b"); ) r* Z2 E2 C% S4 n: o
list.add("c");
4 b( b g1 K0 z0 V4 {7 Y% r list.add("d");
) C" c9 j% h" N- f6 Y6 p6 O- z! ^ list.add("c"); * A. E# ]" s) o0 t9 @
*/
: T, d" X5 `1 K4 d4 {) _6 |+ K6 l5 [+ ]% @5 H6 H% ]; n+ [; v
//"c"在Arraylist有连续存储 ' N. V+ G7 P g* g
list.add("a");
# W7 n2 a' e2 @- C1 u: o6 _% z list.add("c");
) K0 S7 V3 b0 U6 R$ Z+ W N. H list.add("c");
; _" A, n9 U1 h8 O& a2 g list.add("b"); 0 a* B" V4 U O; Y3 g7 G+ x1 i& s
list.add("c"); / d8 h8 G: Q9 Z3 n! X# V
list.add("c"); - z0 B2 ^! |4 Q( f p7 x
list.add("d"); ( Q9 e- h$ A, a) r e9 u
list.add("c"); # b: R3 ?- c' W1 m6 O
/ p' p/ j) i1 J7 q- P
N0 k4 b3 F# p" M //删除Arraylist中值为"c"的元素 6 M/ M: m9 T1 q ^2 Z& p% }7 I# M
' K4 _+ x) @, C% Z8 S2 v/ I) A //有可能不能全部删除 ) u& [4 C; E0 f% Y: X
//removeListElement1(list); ) ^# c9 n( A- u1 {8 o* U' S
( }7 |6 m: ~% B7 R- B' Q# B% d! l
//能够正确删除 1 D5 @( m) ^0 e( W
//removeListElement2(list); 0 q3 [2 W8 a! V5 D6 o' @2 v0 r W7 Q
* f( G g* I) L! |3 B: T6 m
//能够正确删除
/ {4 ^ H$ Z6 b4 y' i1 m4 A //removeListElement3(list);
# i) m- G$ P D' ^ }
' Q ~; E/ p2 p3 f: R* \ z1 c! N; {3 D$ j2 G: y
% h! G0 O% Z$ S
/** 3 M$ G# b F3 z. I' |
* 删除list中值为"c"的元素 Q$ k+ K% |; [# @% K/ h
* - l1 p Y) I! x
* 这种方式:
3 R \) ]9 G4 C- O( S/ a: \" y *
; q$ N4 m* x( |9 U& {4 \- ~6 L * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
# S; `+ Q; |; N* T9 b *
% N+ I8 ^* ~: F * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ; j) p; ?; s- D# T" }
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 : a& M2 r- P% l- _+ E( n7 x- h
*/ 8 |# Q/ e, g6 {% D8 f9 Q4 z# K3 P
public static void removeListElement1(List<String> list) {
7 ?* F) Z5 t+ ?3 T- n E for(int i=0;i<list.size();i++) { % n" ~) I/ q( P* h- Z6 v X
if("c".equals(list.get(i))) { . v* \4 `0 B, k* `# k$ M" Q9 K
list.remove(i);
5 b5 X% e% o1 ?% n% }& Y } / p$ M# s- D* m: H. T4 ]
}
& x% Y1 t. v9 F# L% A
! s1 ~1 S1 v# H( K } - @& S* ^+ C- z4 \1 C$ K' D* n
3 B" H7 B7 z; @( M
/**
! X# L& S) M, x * 删除Arraylist中值为"c"的元素
. f e0 E n8 h0 h @ * 7 U# E" G6 t( o( I3 @) y: Q
* 这种方式:
* x: b5 @# k& i' J: w& i *
1 a! _4 A0 S% d * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 8 ^8 {0 [8 P9 h' d3 W& r* ^2 C
*/
5 j: Z& E# y$ @$ \' i: w public static void removeListElement2(List<String> list) {
( n2 {( w( M" ^* o. Q for(int i=0;i<list.size();i++) {
4 Y0 y) Z0 I2 X5 _. t2 }, B if("c".equals(list.get(i))) { 0 M* E2 _7 s2 a5 m
list.remove(i); 2 n L" M0 `( o( n, u# V
--i;//删除了元素,迭代的下标也跟着改变
- d+ R8 H, W: t$ T% g4 ]9 D8 l } B; v/ N0 t3 z4 b S
} 0 n7 v; B& w5 R. i) r
} % C# Z2 h: ~( Z7 r* C) n& u
$ D: }; N$ D1 z+ f- m
/**
5 |. M# Z( E& N7 j- ] * 删除Arraylist中值为"c"的元素
9 `! l' p: y1 a" E( U# y- F * # g- P9 p/ @4 [+ l! w; k( }
* 这种方式:
8 b ?* N4 t% }' F *
# b# E9 H2 p7 Y * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
' r/ ?: @! V; ]/ N: y: s* w# ^5 D6 k * : i3 L8 O) a7 y
* 需保证没有其他线程同时在修改
' i) p0 u0 e5 I& u9 R; x */ + I: H8 A& y& a, S! Q8 w
public static void removeListElement3(List<String> list) { Q$ b/ x" S b+ W" f" W- w
Iterator<String> iterator = list.iterator(); % p' I5 T: s: \0 n" `# K3 B3 c
while(iterator.hasNext()) { " ^- ~8 c. t7 ]+ y6 e2 i9 S4 C) \
String str = iterator.next(); 2 J% \$ v! x( m: O+ j
if("c".equals(str)) { , P& p$ j- `3 s5 n4 ?2 J1 I# u( t
iterator.remove();
. I* x. Z( `3 A d" B% t& D }
" C9 q; `: ^, i; `0 k1 Y+ M y# l
}
" f9 K% b7 ^6 H( {7 ~) E3 q/ B }
) k J q+ b, [3 Q" B9 d+ W3 g- t* g) D, M9 z
|
|