2013-07-24 4 views
6

Ich erwarte, dass der folgende Code mir eine Teilmenge und eine komplementäre Menge geben würde.Wie Set.contains() entscheidet, ob es eine Teilmenge ist oder nicht?

Aber eigentlich zeigt das Ergebnis, dass "Fehler: Dies ist keine Untermenge!"

Was it.next() bekommen und meinen Code zu überarbeiten, um das gewünschte Ergebnis zu bekommen? Danke!

package Chapter8; 

import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 

public class Three { 
    int n; 
    Set<Integer> set = new HashSet<Integer>(); 

    public static void main(String args[]) { 
     Three three = new Three(10); 
     three.display(three.set); 
     Set<Integer> test = new HashSet<Integer>(); 
     Iterator<Integer> it = three.set.iterator(); 
     while(it.hasNext()) { 
      test.add(it.next()); 
      three.display(test); 
      three.display(three.complementarySet(test)); 
     } 

    } 

    boolean contains(Set<Integer> s) { 
     if (this.set.contains(s)) 
      return true; 
     else 
      return false; 
    } 

    Set<Integer> complementarySet(Set<Integer> s) { 
     if(this.set.contains(s)){ 
      Set<Integer> result = this.set; 
      result.removeAll(s); 
      return result; 
     } 
     else { 
      System.out.println("Error: This is not a subset!"); 
      return null; 
     } 
    } 

    Three() { 
     this.n = 3; 
     this.randomSet(); 
    } 

    Three(int n) { 
     this.n = n; 
     this.randomSet(); 
    } 

    void randomSet() { 
     while(set.size() < n) { 
      set.add((int)(Math.random()*10)); 
     } 
    } 

    void display(Set<Integer> s) { 
     System.out.println("The set is " + s.toString()); 
    } 
} 
+0

Sie müssen Set api wissen, bevor Sie Set verwenden. Bitte beachten Sie mein Tutorial [Internes Leben von HashSet] (http://volodial.blogspot.com/2013/07/internal-life-of-hashset-in-java.html) –

+0

@VolodymyrLevytskyi Ihr Link ist kaputt, ist der Artikel immer noch woanders verfügbar? – Noumenon

Antwort

2

Ihr Problem ist in diesem Teil:

set.contains(s) 

das nicht tun, was Sie denken, es tut, ist es nicht als Argument nehmen Sie ein anderes Set zu sehen, ob ihre Mitglieder in enthalten sind, die erste set. Es sieht eher so aus, ob das übergebene Argument im Set enthalten ist.

Sie müssen über die "enthaltene" Menge iterieren und set.contains(element) für jedes Element in der enthaltenen Menge verwenden.

20

Wahrscheinlich möchten Sie set.containsAll(Collection <?> C) verwenden, um zu überprüfen, ob Collection (Set, in diesem Fall) eine Teilmenge von 'set' ist. Aus der Dokumentation: http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#containsAll(java.util.Collection)

boolean containsAll(Collection c)

Returns true if this set contains all of the elements of the specified collection. If the specified collection is also a set, this method returns true if it is a subset of this set.