该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。/ ]4 ]3 a( @+ h' n" [2 H
AD:, ^$ b) J8 k: w) U' D
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
( U' F5 n7 ~/ X" G! E$ d& E9 _7 X
将一些删除方法做一些总结:2 M% y& e9 d2 @7 R/ E
6 f9 X. |. S' X
/** 0 Z! l9 `. h- [5 |% A4 g. r
* 删除Arraylist中值为"c"的元素
- u6 J& W5 |- m) A* {2 }: c1 Q */
( u4 W+ r8 B- L public static void main(String[] args) {
2 o e1 Y! g; M' v% f: V k- Z' M" t4 O* F) [' i! B; s3 I
List<String> list = new ArrayList<String>(); $ E3 A+ I5 D' i4 a' J
7 N. w5 ~( y( r* R1 D& J //"c"在Arraylist不连续存储 3 D9 M0 R: O+ i2 @8 Q1 A
/* ' y1 C$ `7 ]" |& ~ n( |
list.add("c");
$ Q4 h) p5 ?2 i) U7 \! ^- b* o list.add("a"); $ K6 W6 _- N* H0 G# |
list.add("c"); # N" Z+ e" P9 E( q; Q
list.add("b"); ( G1 b/ }. Y/ S% L; g* [/ s
list.add("c"); - e/ k/ ^9 x ~9 K7 V7 P. V
list.add("d");
) k0 O' b9 E1 i# o list.add("c"); 7 G) Q+ _/ q# R9 `1 Z; a
*/
' V% r9 I8 w a5 p' H. @2 o9 c
0 C$ U; E7 O9 U //"c"在Arraylist有连续存储 ) X' @# Y& L0 I3 {7 c' g+ s# A
list.add("a");
! h/ H2 Q6 `" R! K; @- L c) H list.add("c"); - g) k3 J$ F) p) U5 w
list.add("c"); ( g9 ~/ n! b5 a$ e
list.add("b"); " }! Y0 b8 r+ n+ X2 N9 w
list.add("c");
: [# V! b5 r, L5 |5 q. M; w* d list.add("c");
; [0 W! f0 o" P3 E list.add("d");
$ J# Z: X- X8 p5 x, P( M2 ^ list.add("c");
! l# b c; I) l) ^# S. q: W
7 x5 ?2 A# s- G" z/ J" i
/ p$ s* e' J$ J2 Q //删除Arraylist中值为"c"的元素 1 y% |& ~6 E& F; ]% w6 R
* w! z/ e% D7 k6 \
//有可能不能全部删除 3 ?- t w8 W- N; S3 G* X6 p% S
//removeListElement1(list); # Y: V% W9 [- A# I* G
, @. [. i: @( J, H5 B' j6 V9 x
//能够正确删除 # P9 C4 _" D( @+ l" s* j
//removeListElement2(list);
# Q Q9 |0 ] H+ o% a; E! \8 l( y) ]2 @* g( R0 g
//能够正确删除
0 f7 A3 a; C# O3 F //removeListElement3(list);
% X) P/ b8 a+ ]. u0 I } $ {# @) V7 j& B: j ^2 I
; L% M1 {# P% ^1 k: r7 O
: D2 [! ]) V0 ?" U- A
/** ) F4 G% |. j& I0 ~; ]* ^
* 删除list中值为"c"的元素
' V8 k7 ~9 d* r. P- \# _$ a *
. F* R; I+ k, m1 E * 这种方式: # e; |& h, s7 A9 {; v0 _1 U$ a
*
7 Q# i6 H/ R+ U* ~. {! J * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉
. w7 v" |) a3 D w. Z' X3 t *
/ \ ^9 B+ g9 S7 a+ ^) D/ ^* Y * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除
+ ~5 y- \6 v- r9 g6 B, v: @ * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小
7 y- N7 |+ Y/ p */
9 p6 K$ o3 H; e" \ public static void removeListElement1(List<String> list) {
- F8 Y7 Q8 D/ i% v6 |$ b for(int i=0;i<list.size();i++) {
& m9 r9 _/ z! g if("c".equals(list.get(i))) { 7 |6 \5 o. y& \; Y+ q# }7 c; ?
list.remove(i);
5 `+ n( h# E) ~* z1 n6 I; ^ }
4 o- }4 Z7 `+ S; V* G- `2 D }
5 z0 |/ d( r% R1 X, K5 p8 ~4 H. u# J5 ]# ]7 f( q
} " B# {' e1 v( z3 T9 c
- F; o3 X: r( z2 Q% ^, z, w9 y /** + F4 J7 d; Y9 o w8 C
* 删除Arraylist中值为"c"的元素 9 ]1 y$ Z, l/ n9 a; E s! G
* 0 r" n( j: n+ F; j0 ^: c. {* D0 c
* 这种方式:
% h& @# \. F: G6 ^ * : N* ~# C2 c7 B4 O n3 I4 Y6 F/ s; H
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
: j! O( C0 B" P9 [6 H6 T */ , f7 \* W$ v2 `1 K0 ?* { S# |
public static void removeListElement2(List<String> list) { $ B- C, K& u0 n6 ^8 }
for(int i=0;i<list.size();i++) { + q5 [8 q7 o. `: \+ c& Y
if("c".equals(list.get(i))) {
! j$ b" N7 x. o( ]3 ~ list.remove(i); , _, ^9 |% S9 q! Z& p
--i;//删除了元素,迭代的下标也跟着改变
: H. X& e: `- Y+ L' x1 a0 ~/ e }
( P" ]1 Q1 i- m4 K' n( j1 \2 b }
" u3 F2 K, g0 w/ J9 d } ; q, j& z ^# G
+ a# d0 g! _0 Z9 h& z) P, c
/**
5 i: Y/ ?* e" }! `$ [" i * 删除Arraylist中值为"c"的元素 " a8 a V0 c4 i# o. S1 K. C
* . b- i$ o8 `0 g. a/ N; a. q
* 这种方式: 9 o! y8 m. B- m. e; R" c
* 5 m3 D, X8 }. _6 F
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除
& z' o6 x5 g3 b T% p4 N( b( ^; U * 8 e% _8 F$ {( f! h1 H- J7 R9 H
* 需保证没有其他线程同时在修改
( P$ P( h* y9 [+ ]5 c3 Y */
1 B. d& t; n1 Y5 |7 c2 C$ D public static void removeListElement3(List<String> list) {
2 ^/ E6 p" `( [, g% W+ j2 e Iterator<String> iterator = list.iterator();
5 K F d+ A* l W% [( J while(iterator.hasNext()) { 2 }' @$ V W% U% J$ I
String str = iterator.next(); : q/ o& C5 o$ P9 b$ L6 A
if("c".equals(str)) { . O0 k7 }1 F0 w- [% B+ X
iterator.remove(); # c6 J$ H6 A- p4 N! Y, y. b
} & \' ^* ` l" h
9 Q' [: @9 |7 W" i( B! H1 W$ g }
, l, F. j9 i- I } : ~' f' \3 j+ a, i1 s
+ G5 x6 V" Y4 \$ ^" o
|
|