问题描述,假设一个ArrayList存储若干个字符串String元素,这些元素中存在若干重复的、一模一样的元素,编程实现把这些重复元素全部删除。
常见的代码写法是for循环定点删除:
ArrayList<String> arrayList = new ArrayList<>();
arrayList .add("want");
arrayList .add("want1");
arrayList .add("want2");
arrayList .add("want2");
arrayList .add("want2");
for (int i = 0; i < arrayList .size(); i++) {
String s = arrayList .get(i);
if(s.equals("want2"))
arrayList .remove(i);
}
for(int i=0;i<arrayList .size();i++){
System.out.print(arrayList .get(i)+"");
}
输出结果:want want1 want2
这个例子中有5个字符串,其中“want2”重复出现3次,代码本意是把这些重复3此的“want2”字符串完全删除,结果还有参数,可见没有完全删除,原因是在于Java的ArrayList在删除元素时候,整个队列在动态变化,整个队列的index和长度均在变化中,所以在for循环中游标不准。正确的删除方法是使用Java迭代器Iterator进行删除。
例如代码:
ArrayList<String> arrayList= new ArrayList<>();
arrayList.add("want");
arrayList.add("want1");
arrayList.add("want2");
arrayList.add("want2");
arrayList.add("want2");
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("want2")) {
iterator.remove();
}
}
for (int i = 0; i < arrayList.size(); i++) {
String s = arrayList.get(i);
System.out.print(s + "");
}
输出结果:want want1