该用户从未签到
|
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。1 T% o. p; b9 K& n/ ^0 u
AD:
: N9 O. b4 q1 e+ M7 w% p, @昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
, W) h, @. b4 u
& O: h$ [( f9 k9 k p5 s, _9 P d将一些删除方法做一些总结:, N7 p, C! b( @" N1 w
% ?- B' G1 a! J' t& R
/**
( u* o2 i \# d: Q3 c6 w! j5 z * 删除Arraylist中值为"c"的元素 - G. K, E: F' n4 _2 X* O
*/
0 \# X- T; J8 c# W- l public static void main(String[] args) { 1 v' c: W8 D5 D1 g$ v
* U. V1 u! `+ a& ?
List<String> list = new ArrayList<String>(); 0 l( P" i. Y3 r9 O$ p( x
9 t$ f l% e9 D: W& t( n
//"c"在Arraylist不连续存储
& K0 k# o8 o0 m! Q /*
" D. s) S7 f0 ^' w+ A list.add("c"); ; o* H# |: c+ I" ]- p" K! f2 i
list.add("a");
9 G: D8 r! R4 f' r list.add("c");
5 E0 \/ g% z: c/ ~* s list.add("b"); 0 p3 Z P) d2 p: t3 t
list.add("c");
( I3 b( ^) d# ?( S3 O list.add("d"); $ t$ p J' M+ W h
list.add("c");
9 [& e2 E# s" x */ : l# E* J4 ]1 B x1 \3 m9 w
/ S) x, Q N4 ~, T! _
//"c"在Arraylist有连续存储 ; i; V, v0 `+ P5 ~0 z
list.add("a");
5 p4 \) [2 z4 M4 n8 t list.add("c");
: z- x2 s0 Q |9 X list.add("c"); . `2 c* I) h( X! |
list.add("b"); " y' b1 m0 N6 k/ [
list.add("c");
8 H( O: G' H5 z/ ~, S( Z list.add("c");
9 `3 G, b+ r& [ J6 b list.add("d");
0 s$ D, [3 f n$ J, q list.add("c"); 4 D; \3 { k h: `/ H
. k7 i2 z( k- c) ?5 n7 z; Z- H( t- ~! n/ ^; z" ~: b0 W* X3 ~) y
//删除Arraylist中值为"c"的元素
. ]$ h0 q2 j* o# h7 ]( q& `; H
; j" y) S* G5 B3 `2 G* G4 J //有可能不能全部删除 " u! K8 N. l: i4 E: U" y1 P
//removeListElement1(list); & E3 W; q# M9 }7 `6 |
& Z/ e( w! n% h! D& ]7 O0 E5 `
//能够正确删除 6 l* u, r$ O* f) `# n
//removeListElement2(list);
( M7 V+ R7 E2 R1 _9 L
4 c- m4 o- d! o( E' Y* V //能够正确删除 " {0 }9 H7 ^4 O
//removeListElement3(list);
' w! a: ~1 q, K4 i* I' m } # K; y% F6 m( L$ @% x( x4 N
! M9 [9 w; p% K( `7 c, s* Q- z. o, o
/**
5 ^% n% g$ {4 I# \4 G * 删除list中值为"c"的元素
" y0 R2 L- N( c8 r * + E7 X; ^0 y5 [. |, r5 o
* 这种方式: : T3 T# ^6 w( L- y
*
# W8 ^) i% f' `% e/ e0 u9 I) ^7 j1 g * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 . Z7 M$ m, Y' u# U# a
*
6 X5 {) q% i& y t& C3 I/ i; o9 K * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ( M5 E. b- _8 P& }/ N1 g6 a
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 ) Q8 ?9 d3 [0 u2 i- q; y
*/ ) Y. |# v. [. T* q$ m
public static void removeListElement1(List<String> list) {
8 f) }4 N. ]6 H0 B& c, W4 b for(int i=0;i<list.size();i++) { : E: o. N3 l! t
if("c".equals(list.get(i))) { # j+ O9 F, s2 x5 r0 F
list.remove(i); " g; p5 c- h& k
}
, L/ N, m% b3 Z- u3 @7 D$ ` }
3 O2 |; X+ D) c4 l7 I8 C2 `
, U" X2 s X$ i- j, t7 \. `4 L } # L8 w+ R5 I( `6 m
& w* Z0 D- m) u6 N; s /**
7 k& v7 f2 w2 R. F. l0 j9 C * 删除Arraylist中值为"c"的元素 : D% w' H- u3 P( _+ y) b" u
* . s0 |( z/ W8 A: p- C x2 `
* 这种方式: 5 s0 J8 C/ L8 d( t; I6 k
*
f) m# ?) @- }* b3 { Y% x * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除
5 y% i" B1 \. K" f: x4 y) S */ $ y. Y8 L) g% s, u0 N. W6 G1 U
public static void removeListElement2(List<String> list) {
' T$ ~9 b/ ] t( {4 @, r& @) { for(int i=0;i<list.size();i++) { + Q( z! j: z9 }% g& \
if("c".equals(list.get(i))) {
4 v+ g( z& [- H! t8 u+ O list.remove(i); * ^$ |% |$ h0 n$ O* Q7 d2 Z
--i;//删除了元素,迭代的下标也跟着改变
3 ~: E/ a8 @3 u9 [9 n1 V4 } }
8 H# @! u+ J3 O$ V0 U% x1 Y } ! H7 Q! x7 e$ i0 A5 o# H* I- f
} " \. H( x7 S; f. @1 N
! l' a( ^% t! c, G1 O' i
/** 6 O) C$ D6 M' `! Q$ e0 Z
* 删除Arraylist中值为"c"的元素
$ `) H0 R( `( Y *
& u- C; F3 H* ~! b+ n * 这种方式:
3 j( o6 |2 G. o' s G0 c: T. G- C * + i" K Q8 V+ k; u9 w
* 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 $ G8 S1 M& w+ R" x) Q- V/ ]$ [
* ( O# X3 O3 c% Z/ {" y+ t
* 需保证没有其他线程同时在修改
0 P6 b# C j9 O */
3 Y9 |; P/ a2 ~0 Z. | public static void removeListElement3(List<String> list) {
5 q0 D5 m. c; f) i G Iterator<String> iterator = list.iterator();
, B# Y+ }& |3 E- Z% | while(iterator.hasNext()) {
% X* @0 C9 e4 t7 M) c8 y2 Z2 } String str = iterator.next();
+ S) i- S7 U5 z7 W if("c".equals(str)) { 4 \% f5 Z: z, W9 R) F
iterator.remove();
- ~3 D' @; K7 @ } 1 C6 O! e) r7 a9 X
8 ^; @ P' c- [4 z# c$ f2 N6 r }
# G$ q' c+ x* z, R } ! \3 y$ Y; C+ v& N
4 v1 B" F6 M1 j+ v* A
|
|