所以我试图打印出我制作的所有宠物。主要是我有方法 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{
}
答案 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}},而不是它们的一些新实例。