假如我有一個List,其中包含了6個元素,我想刪除其中的前面4個,應該如何做;好多程序員不加思索,寫下了下面的代碼:

2

3

4

5

6

7

8

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at com.lpx.collection.TestArrayDeletion.unSafeDeleteTopByCount(TestArrayDeletion.java:59)
at com.lpx.collection.TestArrayDeletion.main(TestArrayDeletion.java:26)
看到這里,可能大家已經明白了;對了,在刪除的過程中,List的size發(fā)生了變化,但是index沒有變化,就會造成index>=size的情況發(fā)生,拋出IndexOutOfBoundsException是一定的。這還算好的,至少你知道有異常,但是還有一種更隱蔽的情況,如果你刪除的個數(shù)是3個,IndexOutOfBoundsException是不會發(fā)生的,但是刪除后的List不是你想要的結果。具體是























str1
str3
str5
為什么呢,當我們刪除了index為0的元素【str0】后,由于List的size變化,index為0的元素會變?yōu)閟tr1,而index為1的元素會變?yōu)閟tr2,這時由




































如何解決這個問題呢,筆者在上面給出了4種方法供大家參考,最后給出了完整的代碼。
*****************************************************************************
package com.lpx.collection;
import java.util.ArrayList;
import java.util.List;
public class TestArrayDeletion {
private List<String> list = null;
public static String[] array = { "str0", "str1", "str2", "str3", "str4",
"str5" };
public TestArrayDeletion() {
super();
list = new ArrayList<String>();
}
/**
* @param args
*/
public static void main(String[] args) {
TestArrayDeletion arrayDeletion = new TestArrayDeletion();
arrayDeletion.initList();
arrayDeletion.unSafeDeleteTopByCount(3);
arrayDeletion.initList();
arrayDeletion.unSafeDeleteTopByCount(4);
arrayDeletion.initList();
arrayDeletion.safeDeletionTopByCountMethod1(4);
arrayDeletion.initList();
arrayDeletion.safeDeletionTopByCountMethod2(4);
arrayDeletion.initList();
arrayDeletion.safeDeletionTopByCountMethod3(4);
arrayDeletion.initList();
arrayDeletion.safeDeletionTopByCountMethod4(4);
}
private void initList() {
list.clear();
for (String str : array) {
list.add(str);
}
}
private void print() {
for (String str : list) {
System.out.println(str);
}
}
private void unSafeDeleteTopByCount(int count) {
System.out.println("*********unSafeDeleteTopByCount*********");
try {
for (int i = 0; i < count; i++) {
list.remove(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
print();
}
}
private void safeDeletionTopByCountMethod1(int count) {
System.out.println("*********safeDeletionTopByCountMethod1*********");
for (int i = count - 1; i >= 0; i--) {
list.remove(i);
}
print();
}
private void safeDeletionTopByCountMethod2(int count) {
System.out.println("*********safeDeletionTopByCountMethod2*********");
for (int i = 0; i < count; i++) {
list.remove(0);
}
print();
}
private void safeDeletionTopByCountMethod3(int count) {
System.out.println("*********safeDeletionTopByCountMethod3*********");
List<String> localList = new ArrayList<String>();
for (int i = 0; i < count; i++) {
localList.add(list.get(i));
}
list.removeAll(localList);
print();
}
private void safeDeletionTopByCountMethod4(int count) {
System.out.println("*********safeDeletionTopByCountMethod4*********");
List<String> localList = new ArrayList<String>();
localList.addAll(list);
for (int i = 0; i < count; i++) {
String str = localList.get(i);
list.remove(str);
}
print();
}
}