2014-02-22 4 views
-1

그래서 내가 만든 모든 애완 동물을 outprint하려고합니다. 주로 내가 문제 removeCats, 내가 그렇게 생각 ... 문제가 어떻게 그것을 제대로 컴파일하게 내 removeCats 내 메서드를 변경할 수 있습니까?방법 remove/removeAll does not work 正しく

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. 여기 나는 4 고양이를 반환해야합니다 메서드 createCats를 확인하십시오.

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. 여기서 나는 3 마리의 개를 돌려 주어야하는 createDogs 메소드를 만든다.

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{ 

} 
+2

반복기를 사용하지 않는 이유는 무엇입니까? 당신은 객체를 추출하지만, 아무것도하지 않습니다. –

+0

질문하지 않았습니다. –

+0

만약 내가 그것을 e == cats로 바꾼다면, 그것 또한 corectly로 작동하지 않습니다. –

답변

1

코드에 나타나는 몇 가지 문제점이 있습니다.

  • removeCats 함수는 반복자를 작성하고 사용하지 않고 세트에서 반복되는 항목을 제거하기 때문에 ConcurrentModificationException으로 폭발합니다. 많은 다른 답변이이를 지적했으며이를 해결하는 가장 좋은 방법은이 전체 기능을 pets.removeAll(cats);과 같은 것으로 바꾸는 것입니다. 당신이 정말로 어떤 이유로 반복자를 사용해야하는 경우, 당신은 cats을 통해 반복하는해야하고,이 고정되면, 당신은 끔찍하게 충돌하지 않습니다 pets.remove(cat);

호출. 그러나 ...removeCats은 여전히 ​​cats에있는 객체 중 어느 것도 실제로 pets에 존재하지 않으므로 예상 한대로 수행하지 않습니다! :

  • 귀하의 join 기능이 나는 그것이 메서드 서명을 기반으로 할 기대할 수있는 일을하지 않습니다 - 그것은 함께 두 세트에 합류, 대신 입력을 폐기하고 새로운 목록을 작성 아니에요. 당신은 아마 당신이이 문제를 해결하면, 당신의 printPets 기능이 제대로 작동하고 pets 실제로 포함하기 때문에 removeCats 실제로 오른쪽 효과를가 호출되는 방법이됩니다

    pets.addAll(cats); 
    pets.addAll(dogs); 
    

같은 것을하고 싶어 cats이며 새 인스턴스가 아닙니다.

1

당신은 설정 동안 iterating를 업데이트 할 수는 it.Also containsAll 반환 true

if(pets.containsAll(cats)) 
{ 
     pets.removeAll(cats); 
} 
1

버그가 removeCats() 방법이 있다면 요소를 제거 it.Simply 반복 할 사용량이 없다 폭발을 일으킬 것입니다. 컬렉션을 반복하면서 컬렉션을 직접 수정하고 있습니다.

반복하는 동안 요소를 추가하거나 제거 할 수 없습니다. 당신은 iterator.remove();

1

이가 시도 호출 할 수 있습니다 : 그것은 반복하는이 당신에게 당신이처럼 사용할 수있는 해, ConcurrentModificationException

을 줄 것이다 동안,

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

작동하지만, 나에게 잘못된 출력을 여전히 컴파일합니다. 아마도 그 뭔가 = \ –

+0

@Predict_it 무엇을하려고합니까? –

+0

@Predict_it 원래 질문을 편집하여 포함하십시오. 또한 예제 입출력을 제공해야합니다. –

1

당신은 설정에서 요소를 제거 할 수 없습니다

pets.removeAll(cats);