/***************************************************************/
/* Prof. Dr. Carsten Vogt                                      */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                      */
/* http://www.nt.fh-koeln.de/vogt                              */
/*                                                             */
/* Das Programm demonstriert Basismethoden auf HashSets,       */
/* mit denen Mengen gespeichert werden.                        */
/* Bei HashSets sind, im Unterschied zu TreeSets, die Elemente */
/* in keiner bestimmten Reihenfolge angeordnet.                */
/* Das Programm ist erst ab Java 5 lauffaehig!                 */
/***************************************************************/

import java.io.*;
import java.util.*;

public class HashSets {

 public static void main(String[] args)  {

  /* Deklaration und Erzeugung eines HashSets (= ungeordnete Menge). 
     Der HashSet ist zu Beginn leer. */

  HashSet<Integer> menge = new HashSet<Integer>();

  /* Feststellung der Groesse und Test auf leere Menge */

  System.out.println();
  System.out.println("HashSet 'menge' wurde erzeugt:");
  System.out.println(" menge.size(): "+menge.size());
  System.out.println(" menge.isEmpty(): "+menge.isEmpty());
  System.out.println();
  
  /* Hinzufuegen von vier Elementen */

  menge.add(6);
  menge.add(2);
  menge.add(8);
  menge.add(4);

  /* Feststellung der Groesse,
     Test auf leere Menge,
     Ausgabe des Inhalts,
     Test, ob bestimmte Elemente vorhanden sind. */

  System.out.println("Elemente 6,2,8,4 wurden hinzugefuegt:");
  System.out.println(" menge.size(): "+menge.size());
  System.out.println(" menge.isEmpty(): "+menge.isEmpty());
  System.out.print(" Inhalt von menge: ");
  for (Iterator it=menge.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  System.out.println(" menge.contains(8): "+menge.contains(8));
  System.out.println(" menge.contains(7): "+menge.contains(7));
  System.out.println();

  /* Entfernen von Elementen */

  System.out.println("Ausfuehrung von menge.remove(2)");
  menge.remove(2);
  System.out.println("Ausfuehrung von menge.remove(4)");
  menge.remove(4);
  System.out.println(" menge.size(): "+menge.size());
  System.out.print(" Inhalt von menge: ");
  for (Iterator it=menge.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  System.out.println();

  /* Entfernen aller Elemente */

  menge.clear();
  System.out.println("menge.clear() wurde ausgefuehrt:");
  System.out.println(" menge.size(): "+menge.size());
  System.out.println(" menge.isEmpty(): "+menge.isEmpty());
  System.out.print(" Inhalt von menge: ");
  for (Iterator it=menge.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  System.out.println();

  /* Mengenoperationen */

  Set<Integer> m1 = new HashSet<Integer>(),
               m2 = new HashSet<Integer>(),
               m3 = new HashSet<Integer>();

  /* Aufbau und Ausgabe der Testmengen m1 und m2 */

  m1.add(1);
  m1.add(2);
  m1.add(3);
  m2.add(2);
  m2.add(3);
  m2.add(4);

  System.out.println("Mengenoperationen:");

  System.out.print(" m1: ");
  for (Iterator it=m1.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  System.out.print(" m2: ");
  for (Iterator it=m2.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
 
  /* Vereinigung */

  m3.addAll(m1);
  m3.addAll(m2);
  System.out.print(" Vereinigung von m1 und m2: ");
  for (Iterator it=m3.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  
  /* Durchschnitt */

  m3.clear();
  m3.addAll(m1);
  m3.retainAll(m2);
  System.out.print(" Durchschnitt von m1 und m2: ");
  for (Iterator it=m3.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
  
  /* Differenz */

  m3.clear();
  m3.addAll(m1);
  m3.removeAll(m2);
  System.out.print(" Differenz m1 - m2: ");
  for (Iterator it=m3.iterator();it.hasNext();)
   System.out.print(it.next()+" ");
  System.out.println();
   
 }

}

