首页 新闻 会员 周边 捐助

java中ArrayList集合,希望大神能给我解答,我为什么错了?

0
悬赏园豆:20 [已解决问题] 解决于 2018-05-04 16:07
//需求:删除集合中的重复数据
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);
            }
        }
    }
}

江小白鞋的主页 江小白鞋 | 初学一级 | 园豆:102
提问于:2018-05-04 14:28
< >
分享
最佳答案
1

不能用list.remove(book); 用it.remove();

因为你list.remove(book);会更改modCount,这样下次it的next方法就会报错了

final void checkForComodification() {

            if (modCount != expectedModCount)

                throw new ConcurrentModificationException();

}

而it自己的remove方法每次都会使expectedModCount = modCount; 这样就不会报这个错误了

收获园豆:20
让我发会呆 | 老鸟四级 |园豆:2929 | 2018-05-04 15:16

如果我用it.remove()的话,这样我不是都给删除了么

它这个是删除迭代器返回的最后一个元素

我是初学者额。。。。

江小白鞋 | 园豆:102 (初学一级) | 2018-05-04 15:49

@江小白谢: 假如不报ConcurrentModificationException这个异常,你原先代码里的remove也是全部都给删除了的,因为你的list.contains(book) 肯定返回的是true, 想要删除什么你要自己控制好if里的条件判断,但是记住要用it.remove()。

让我发会呆 | 园豆:2929 (老鸟四级) | 2018-05-04 16:02

@让我发会呆: 谢谢

江小白鞋 | 园豆:102 (初学一级) | 2018-05-04 16:08
其他回答(1)
0

用了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);

}

西红柿里没有番茄 | 园豆:645 (小虾三级) | 2018-05-04 15:54

这个方法我知道,我只想用另一个方法而已,不过还是谢谢你提醒我了,集合在迭代的时候,集合的长度的不能随便改变的,也就是在迭代体里面不能使用集合的方法改变集合的长度,只能修改和查询

支持(0) 反对(0) 江小白鞋 | 园豆:102 (初学一级) | 2018-05-04 16:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册