//需求:删除集合中的重复数据 class Book{ int id; String name; public Book(int id , String name) { this.id = id; this.name = name; } @Override public boolean equals(Object obj) { Book book = (Book)obj; if(this.id == book.id) { return true; }else { return false; } } @Override public String toString() { return "{ 书号:"+this.id+" 书名:"+this.name+" }"; } } public class Demo2 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new Book(1001, "java编程思想")); list.add(new Book(1002, "java核心技术")); list.add(new Book(1003, "javaweb")); list.add(new Book(1004, "java编程思想")); clearRepeat(list); System.out.println(list); } public static void clearRepeat(ArrayList list) { Iterator it = list.iterator(); while(it.hasNext()) { Book book = (Book)it.next(); if(list.contains(book)) { list.remove(book); } } } }
不能用list.remove(book); 用it.remove();
因为你list.remove(book);会更改modCount,这样下次it的next方法就会报错了
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
而it自己的remove方法每次都会使expectedModCount = modCount; 这样就不会报这个错误了
如果我用it.remove()的话,这样我不是都给删除了么
它这个是删除迭代器返回的最后一个元素
我是初学者额。。。。
@江小白谢: 假如不报ConcurrentModificationException这个异常,你原先代码里的remove也是全部都给删除了的,因为你的list.contains(book) 肯定返回的是true, 想要删除什么你要自己控制好if里的条件判断,但是记住要用it.remove()。
@让我发会呆: 谢谢
用了remove()方法,集合的长度都变了,所以肯定会报错,你可以创建一个新的集合,如果不重复就放到新集合里去,然后把原来的集合清空,把新集合赋给原先的集合
public static void clearRepeat(ArrayList li) {
ArrayList new_list = new ArrayList<>();
Iterator it = li.iterator();
for(int i=0;i<li.size();i++) {
Book book = (Book)li.get(i) ;
if (!new_list.contains(book)) {
new_list.add(book);
}
}
li.clear();
li.addAll(new_list);
}
这个方法我知道,我只想用另一个方法而已,不过还是谢谢你提醒我了,集合在迭代的时候,集合的长度的不能随便改变的,也就是在迭代体里面不能使用集合的方法改变集合的长度,只能修改和查询