home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Einführung

Java bietet ein umfassendes Collection-Framework an. Eine Collection kann man sich als einen Container vorstellen, der Objekte in sich aufnehmen kann. Zudem haben diese Collections Methoden, mit welchen die Menge der enthaltenen Elemente bearbeitet werden kann, beispielsweise Elemente der Collection hinzufügen, entfernen oder sortieren.

Klassenhierarchie

Java unterscheidet streng genommen zwischen Klassen, die von Collection und jenen die Map abgeleitet werden. Obige Grafik zeigt die Hierarchie der Interfaces des Collection Frameworks.

Collection

Collection ist das oberste Interface in der Hierarchie. Es gibt keine Implementierung dieses Interfaces, sondern nur von dessen vererbeten Interfaces List und Set.

Set

Ein Set ist eine Collection, die keine doppelten Elemente beinhalten kann. Es hängt von der konkreten Implementierung abhängt, ob die Reihenfolge gewahrt wird, mit der die Elemente hinzugefügt werden. Dies ist meist nicht der Fall. Ein Sub-Interface ist das SortedSet, welches die Elemente automatisch sortiert. Um Elemente sortierbar zu machen, müssen sie zusätzlich das Interface Comparable implementieren.

Die Klasse HashSet implementiert das Interface Set, während TreeSet das Interface SortedSet implementiert.

List

Im Gegensatz zu Set erlaubt List doppelte Elemente. Die Reihenfolge der Elemente beim Einfügen bleibt erhalten. Auf diese kann dann über die Position mittels get(int i) zugegriffen werden. Einer der bekanntesten Vertreter an Klassen, die List implementieren, ist Vector.

Map

Bei Maps werden die Elemente über einen Schlüssel zur Sammlung hinzugefügt und können über diesen auch wieder geholt werden. So könnten alle Objekte vom Typ Student über die Matrikelnummer zu einer Map hinzugefügt werden. Die Schlüssel müssen jedoch Objekte sein, in diesem Beispiel böte sich das das Objekt Integer an.

Die java.util.Hashtable implementiert das Map Interface. Möchte man die Schlüssel automatisch sortiert haben, bietet sich die SortedMap mit ihrer Implementierung, der TreeMap, an.

Umsetzen einer 1:n Beziehung

Geben sei das folgende Klassendiagramm, das in Java-Code umgesetzt werden soll. Sie finden zwei Alternativen.

  • Einmal enthält bildet die Klasse Hochschule die Beziehung über eine Map (genauer SortedMap) ab,
  • das andere Mal über ein HashSet (einfacher)

Folglich finden Sie zwei Implementierungen der Klasse Hochschule.

Klasse Student

package comparing;

public class Student implements Comparable{
  private String name;
  private int matrikel;
  private Hochschule hochschule;
  
  public Student(String name, int matrikel) {
    this.name = name;
    this.matrikel = matrikel;
  }

  //Hiermit können die Instanzen der Klasse Student in SortedSets eingefügt werden
  public int compareTo(Object o) {
    if (instanceof Student){
      Student vergleich = (Student)o;
      //return this.getMatrikel() - vergleich.getMatrikel();
      return this.getName().compareTo(vergleich.getName());
    }
    return 0;
  }

  public Hochschule getHochschule() {
    return hochschule;
  }
  public void setHochschule(Hochschule hochschule) {
    this.hochschule = hochschule;
  }
  public int getMatrikel() {
    return matrikel;
  }
  public void setMatrikel(int matrikel) {
    this.matrikel = matrikel;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

Klasse Hochschule (mit SortedMap)

package comparing;

import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;

public class Hochschule {
  private SortedMap<Integer, Student> studenten = new TreeMap<Integer, Student>();
  
  /**
   * Element hinzufügen 
   */
  public void immatrikuliere(Student student){
    System.out.println("Ich immatrikuliere " + student.getName());
    studenten.put(student.getMatrikel(), student);
    student.setHochschule(this);
  }
  
  /**
   * Element löschen
   */
  public void exmatrikkuliere(Student student){
    studenten.remove(student.getMatrikel());
    student.setHochschule(null);
  }

  /**
   * Alle Elemente holen 
   */
  public Collection<Student> getStudenten() {
    return studenten.values();
  }
}

Klasse Hochschule (mit HashSet)

package einszun;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class Hochschule {
  private Set<Student> studenten = new HashSet<Student>();

  /**
   * Element hinzufügen 
   */
  public void immatrikuliere(Student student) {
    System.out.println("Ich immatrikuliere " + student.getName());
    studenten.add(student);
    student.setHochschule(this);
  }

  /**
   * Element löschen
   */
  public void exmatrikkuliere(Student student) {
    studenten.remove(student.getMatrikel());
    student.setHochschule(null);
  }

  /**
   * Alle Elemente holen 
   */
  public Collection<Student> getStudenten() {
    return studenten;
  }
}

Klasse, die mit Hochschule und Student arbeitet

package comparing;

public class StartHS {
  public static void main(String[] args) {
    Student alexander = new Student("Alexander"923);
    Student julia = new Student("Julia"456);
    
    Hochschule htwg = new Hochschule();

    //Immatrikulieren und Ausgeben
    htwg.immatrikuliere(alexander);
    htwg.immatrikuliere(julia);
    for(Student student : htwg.getStudenten()){
      System.out.println("Wir haben eine(n) StudentIn: " + student.getName());
    }
    
    //Exmatrikulieren und Ausgeben
    htwg.exmatrikkuliere(alexander);
    for(Student student : htwg.getStudenten()){
      System.out.println("Wir haben eine(n) StudentIn: " + student.getName());
    }
    
    
//    Ausgeben über klassische Schleife, Collection in Array konvertieren    
//    Student[] studenten = (Student[])htwg.getStudenten().toArray();
//    for(int i = 0; i < studenten.length; i++){
//      System.out.println("Wir haben eine(n) StudentIn: " + studenten[i].getName());
//    }
  }
}