Übungen (Collections)

Fragen

Was sind günstige, bzw. ungünstige Anwendungsszenarien für die folgenden Klassen des Java Collection Frameworks?

  • LinkedList
  • ArrayList
  • TreeSet
  • HashSet

Klasse Student

Die Übungen dieser Seite verwenden die Klasse Student. Studenten haben eine Matrikelnummer, einen Vornamen, einen Nachnamen und eine aktuelles Semester. Für die Klasse wurden alle Methoden zum Vergleichen überladen. Zwei Studenten sind identisch wenn sie die gleiche Matrikelnummer besitzen.

package s2.collection;

public class Student implements Comparable {
   int matrikelnr;
   String name;
   String vorname;
   int semester;

   public Student(String n, String vn, int nr, int sem) {
      name = n;
      vorname = vn;
      matrikelnr = nr; 
      semester = sem;
  }

   public String toString() {
      return "(" + matrikelnr + "," + name + " " + vorname
         + ", " + semester + ")";
   }

   /**
   * Studenten werden anhand Ihre Matrikelnr verglichen
   * @param o
   * @return
   */
   public int compareTo(Object o) {
      int diff = 0;
      if (o.getClass() == getClass()) {
         diff = matrikelnr - ((Student) o).matrikelnr;
      }
      if (diff > 0) {
         diff = 1;
      }
      if (diff < 0) {
         diff = -1;
      }
   return diff;
   }

   public boolean equals(Object o) {
      return (compareTo(o) == 0);
   }
   public int hashCode() {
      return matrikelnr;
   }
}

Mengen von Studenten

Das Programm soll eine Menge von Studenten verwalten. Vervollständigen Sie das das folgende Programm:

  • main() Methode
    • Setzen Sie die Objekterzeugung für die Variablen mengeUnsortiert und mengeSortiert ein
    • Fügen Sie alle Studenten in beide Mengen ein indem Sie die Platzhalter-Konsolenausgaben ersetzen
  • ausgaben() Methode: Iterator über eine Menge implementieren
    • Deklarieren und initialisieren Sie ein Iteratorobjekt für das Listenobjekt welches als Parameter übergeben wurde
    • Implementieren Sie korrekte Abbruchbedingung für die while-Schleife
    • Implementieren die while-Schleife. Weisen Sie der Variablen s einen jeweils neuen Student der Menge zu

Beobachtungen:

  • Welche der beiden Mengen ist sortiert?
  • Welche Mengenimplementierungen nutzen Sie für welche Aufgabenstellung?
  • Was geschieht mit Caroline Herschel?
package s2.collection;

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

public class SetIterDemo {

   public static void main(String[] args) {
      Set<Student> mengeUnsortiert = null; // Hier HashSetobjekt einfügen
      Set<Student> mengeSortiert = null; // Hier TreeSetobjekt einfügen
      Student s;
      s = new Student("Curie", "Marie", 19, 1);
      System.out.println("Hier Student " + s + "in beide Mengen einfügen");
      s = new Student("Merian", "Maria-Sybilla", 17, 3);
      System.out.println("Hier Student " + s + "in beide Mengen einfügen");
      s = new Student("Noether", "Emmi", 16, 1);
      System.out.println("Hier Student " + s + "in beide Mengen einfügen");
      s = new Student("Liese", "Meitner", 15, 2);
      System.out.println("Hier Student " + s + "in beide Mengen einfügen");
      s = new Student("Herschel", "Caroline", 15, 2);
      System.out.println("Hier Student " + s + "in beide Mengen einfügen");
      ausgaben(mengeUnsortiert); 
      ausgaben(mengeSortiert);
   }

   public static void ausgaben(Set<Student> menge) {
      Student s;
      System.out.println("Hier Iterator deklarieren");
      System.out.println("Inhalt der Menge ("
         + menge.getClass() + "):"); // Nicht ersetzen
      while (true) { // Abbruchbedingung ersetzen. Die Schleife terminiert so nicht!
          System.out.println("Hier Student aus Iterator in Schleife auslesen");
          s = null;
          System.out.println("Student: " + s); // Nicht ersetzen
     }
   }
} // Ende der Klasse

Maps von Studenten

Das folgende Programm soll Studenten mit Hilfe zweier Maps verwalten. Studenten sollen nach Matrikelnummer und nach Nachnamen verwaltet werden.  Vervollständigen Sie das das folgende Programm:
  • main() Methode
    • Setzen die die Objekterzeugung für die Variablen matrikelMap und nachName ein (In den beiden Kommentarzeilen)
      • matrikelMap soll als Schlüssel die Matrikelnummer des Studenten verwenden, der Inhalt soll aus Studenten bestehen
      • nachnameMap soll als Schlüssel den Nachnamen des Studenten verwenden, der Inhalt soll aus Studenten bestehen
      • Welche Typen müssen für die Platzhalter xxx? bei der Variablen und dem Map-Parameter eingesetzt werden?
    • Fügen Sie alle Studenten in beide Mengen ein indem Sie die Platzhalter-Konsolenausgaben ersetzen
  • ausgabenMatrikelnr() Methode: 
    • Iterieren Sie über die Matrikelnummern. Die Matrikelnummern sind die Schlüssel der Map mp
      • Legen Sie einen Iterator an;
      • Definieren Sie die Abbruchbedingung für die while Schleife
      • Lesen Sie die nächste Matrikelnummer in der while Schleife aus (Variable s)
    • Finden Sie die Studenten zur Matrikelnummern 15 und 16.
    • Iterieren Sie über die Studenten. Die Studenten sind die eigentlichen Objekte der Map mp
      • Legen Sie einen Iterator an;
      • Definieren Sie die Abbruchbedingung für die while Schleife
      • Lesen Sie die nächste Matrikelnummer in der while Schleife aus (Variable st)
  • ausgabenNamen() Methode: 
    • Iterieren Sie über die Nachnamen. Die Nachnamen sind die Schlüssel der Map mp
      • Legen Sie einen Iterator an;
      • Definieren Sie die Abbruchbedingung für die while Schleife
      • Lesen Sie den nächsten Nachnamen in der while Schleife aus (Variable str)
    • Finden Sie die Studenten mit den Namen Herschel und Merian.
    • Iterieren Sie über die Studenten. Die Studenten sind die eigentlichen Objekte der Map mp
      • Legen Sie einen Iterator an;
      • Definieren Sie die Abbruchbedingung für die while Schleife
      • Lesen Sie die nächste Matrikelnummer in der while Schleife aus (Variable st)
Beobachtungen:
  • Welche der beiden Maps ist sortiert?
  • Sind die Schlüssel sortiert?
package s2.collection;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapIterDemo {

   public static void main(String[] args) {
      Map<xxx?,Student> matrikelMap = new TreeMap<xxx?,Student>(); // Ersetzen Sie xxx?
      Map<xxx?, Student> nachnameMap = new HashMap<xxx?,Student>();// Ersetzen Sie xxx?
      Student s;
      s = new Student("Curie", "Marie", 19, 1);
      System.out.println("Einsetzen: Studenten "+ s + " in die beiden Maps eintragen. Schlüssel beachten!");
      s = new Student("Merian", "Maria-Sybilla", 17, 3);
      System.out.println("Einsetzen: Studenten "+ s + " in die beiden Maps eintragen. Schlüssel beachten!");
      s = new Student("Noether", "Emmi", 16, 1);
      System.out.println("Einsetzen: Studenten "+ s + " in die beiden Maps eintragen. Schlüssel beachten!");
      s = new Student("Meitner", "Liese", 15, 2);
      System.out.println("Einsetzen: Studenten "+ s + " in die beiden Maps eintragen. Schlüssel beachten!");
      s = new Student("Herschel", "Caroline", 20, 2);
      System.out.println("Einsetzen: Studenten "+ s + " in die beiden Maps eintragen. Schlüssel beachten!");
      ausgabenMatrikelnr(matrikelMap);
      ausgabenNamen(nachnameMap);
   }

   public static void ausgabenMatrikelnr(Map<Integer,Student> mp) {
      int s;
      Student st;
      System.out.println("Einsetzen: Vorbereitungen zum Auslesen der Matrikelnr");

      Iterator<Integer> iterMatrikel = null; // Einsetzen: Zuweisen des Iterators
      System.out.println("Name ("
         + mp.getClass() + "):");
      while (null) { // Einsetzen: Iteratorbedingung einfügen
         s = null // Einsetzen: Auslesen des Iterators
         System.out.println("Matrikelnummer: " + s);
      }
      int mnr = 15;
     System.out.println("Student mit Matrikelnummer " + mnr +
      " ist:" + null); // Einsetzen: Student mit Matrikelnr mnr
     mnr = 16;
     System.out.println("Student mit Matrikelnummer " + mnr +
       " ist:" + null ); // Einsetzen: Student mit Matrikelnr mnr
     System.out.println("Alle Werte der MatrikelMap:");
     Collection<Student> l = null; // Einsetzen: Collection mit den Studenten
     Iterator<Student> iterStudi = l.iterator();
     System.out.println("Name ("
         + mp.getClass() + "):");
     while (null) { // Einsetzen: Schleifenbedingung des Iterators
        // Einsetzen: Auslesen des nächsten Studenten
        System.out.println("Student: " + st);
      }
   }

   public static void ausgabenNamen(Map<String,Student> mp) {
      String str;
      Student st;
      System.out.println("Einsetzen: Vorbereitungen zum Auslesen der Nachnamen");
      System.out.println("Namen ("
         + mp.getClass() + "):");
      while (null) { // Einsetzen: Iteratorbedingung einfügen
          str = null// Einsetzen: Auslesen des Iterators
          System.out.println("Nachname: " + str);
      }
      String nme = "Merian";
      System.out.println("Student mit Name " + nme +
         " ist:" + null); // Einsetzen der Operation zum Auslesen der Studentin mit Namen nme
      nme = "Herschel";
      System.out.println("Student mit Name " + nme +
         " ist:" + + null); // Einsetzen der Operation zum Auslesen der Studentin mit Namen nme
      System.out.println("Alle Werte der NamenMap:");
      Collection<Student> l = null; // Einsetzen: Auslesen der gesamten Collection
      Iterator<Student> iterStudi = l.iterator();
      System.out.println("Name ("
      + mp.getClass() + "):");
     while (null) { // Einsetzen: Iteratorbedingung einfügen
        st = null// Einsetzen: Auslesen des Iterators
        System.out.println("Student: " + st);
     }
  }
}