方法remove / removeAll无法正常工作

时间:2014-02-22 20:32:03

标签: java hashmap set removeall

所以我试图打印出我制作的所有宠物。主要是我有方法 removeCats 的问题,我想是这样的...,我怎样才能改变我的方法removeCats让它正确编译?

public class Solution
{
    public static void main(String[] args)
    {
        Set<Cat> cats = createCats();
        Set<Dog> dogs = createDogs();

        Set<Object> pets = join(cats, dogs);
        printPets(pets);

        removeCats(pets, cats);
        printPets(pets);
    }

// 2。在这里我创建方法createCats,它必须返回4只猫。

public static Set<Cat> createCats()
{

    Set<Cat> result = new HashSet<Cat>();
    result.add(new Cat());
    result.add(new Cat());
    result.add(new Cat());
    result.add(new Cat());

    return result;
}

// 3。在这里我制作方法createDogs,必须返回3只狗。

public static Set<Dog> createDogs()
{

    Set<Dog> resultD = new HashSet<Dog>();
    resultD.add(new Dog());
    resultD.add(new Dog());
    resultD.add(new Dog());

    return resultD;
}

// 4。在这里我制作方法连接,必须返回所有的猫和狗。

public static Set<Object> join(Set<Cat> cats, Set<Dog> dogs)
{

    Set<Object> lol = new HashSet<Object>();
    lol.add(new Cat());
    lol.add(new Dog());

    return lol;
}

// 5。方法removeCats,必须删除所有猫

public static void removeCats(Set<Object> pets, Set<Cat> cats)
{


    Iterator<Object> it = pets.iterator();
    while(it.hasNext()){
        Object e = it.next();
             if(pets.containsAll(cats))
        pets.removeAll(cats);
    }
}

// 6。方法printPets,必须在屏幕上打印出他所包含的所有动物。新线上的每一只动物。

public static void printPets(Set<Object> pets)
{

      for (Object s : pets){
          System.out.println(s);
      }
}

**//1. Inside class solution im making class cat and dog.**

public static class Cat{

}
public static class Dog{

}

5 个答案:

答案 0 :(得分:1)

你无法在iterating时更新Set。也没有用来迭代它。如果containsAll返回true

,请删除该元素
 if(pets.containsAll(cats))
{
        pets.removeAll(cats);
}

答案 1 :(得分:1)

你的removeCats()方法中存在一个会导致爆炸的错误:你在迭代时直接修改了一个集合。

迭代时无法添加或删除元素。您只能拨打iterator.remove();

答案 2 :(得分:1)

试试这个:

public static void removeCats(Set<Object> pets, Set<Cat> cats) {
    pets.removeAll(cats);
}

答案 3 :(得分:1)

你不能从Set中删除元素,迭代它时会给你ConcurrentModificationException

你可以使用什么

pets.removeAll(cats);

答案 4 :(得分:1)

我在您的代码中看到了几个问题:

  • 您的removeCats函数正在创建一个迭代器,而不是使用它,然后可能会使用ConcurrentModificationException进行爆炸,因为您在迭代它时会从pets集中移除内容。许多其他答案已经指出了这一点,解决这个问题的最佳方法是用pets.removeAll(cats);之类的东西替换整个函数。如果由于某种原因你真的必须使用迭代器,你应该迭代cats并调用pets.remove(cat);

一旦修复,你就不会崩溃。 但是...... removeCats仍然无法达到您的预期,因为cats中的所有对象实际上都不存在于pets中!

  • 您的join函数没有根据方法签名执行我期望它执行的操作 - 它不是将两个集合连接在一起,而是丢弃输入并创建新列表。你可能想做类似

    的事情
    pets.addAll(cats);
    pets.addAll(dogs);
    

解决此问题后,您的printPets功能将正常运行,removeCats实际上会以其调用方式产生正确的效果,因为pets实际上会包含cats 1}},而不是它们的一些新实例。