Lab-05 — List, Set (Erweiterung Lab-03)

1. Erweiterung Klasse Mitarbeiter

Die Sozialversicherungsnummer wird als identifizierendes Merkmal verwendet.

Damit diese später auch als intelligenter Map-Key verwendet werden kann, wird eine Klasse SozVersNr erstellt (Unterstrichenes ist static):

mypkgexceptionMitarbeitername: StringsozVersNr: SozVersNrKonstruktor(...)berechneGehalt(): float..()SozVersNrsvnr: longKonstruktor(svnr: long) // private!!SozVersNrFactory(svnr: long): SozVersNrcheckValid(svNr: long) // throws BadSvNrExceptionFirma2mitarbeiterListe: List<Mitarbeiter>Konstruktoren(...)einstellen(mitarb: Mitarbeiter): MitarbeiteranzMitarb(): intentlassen(sozVersNr: SozVersNr): booleansucheMitarbMitNamensbeginn(beginn: String): Set<Mitarbeiter>sucheMitarbAbGehalt(float gehalt): Set<Mitarbeiter>printMitarbeiter(mitarbColl: Collection<Mitarbeiter>)Firma3mitarbeiterSet: Set<Mitarbeiter>Konstruktoren(..)einstellen(mitarb: Mitarbeiter): MitarbeiteranzMitarb(): intentlassen(sozVersNr: SozVersNr): booleansucheMitarbMitNamensbeginn(beginn: String): Set<Mitarbeiter>sucheMitarbAbGehalt(float gehalt): Set<Mitarbeiter>printMitarbeiter(mitarbColl: Collection<Mitarbeiter>)BadSvNrException«throws»

Es ist sicherzustellen, dass die SozVersNr eindeutig ist.

In der SvNr (Sozialversicherungsnummer) ist auch eine Prüfziffer integriert. Damit können einfache Fehler stark reduziert werden. Details dazu finden sich unter Sozialversicherungsnummer Österreich – Wikipedia.

Ein Tool zur Prüfung und Generierung gültiger österreichischer SV-Nummern gibt es unter svnr-prueftool.

Zur Gültigkeitsprüfung ist es nötig, einzelne Ziffern der SozVersNr zu extrahieren.
Neben der Möglichkeit, die SvNr. in Text zu wandeln hier eine rein zahlenbasierte Möglichkeit:

    public static int numLength(long number) {  // liefert Länge einer Ganzzahl
        int digits = 0;
        while (number != 0) {
            digits++;
            number /= 10;
        }
        return digits;
    }
    public static byte getDigitAt(long number, int pos) {  // pos von links (textpos) ab 1
        int length = numLength(number);
        for (int i = 0; number != 0; i++, number /= 10) {
            if (pos == length - i) {
                long digit = number % 10;
                return (byte)Math.abs(digit);   // auch für neg. Zahlen
            }
        }
        return -1;  // falls pos ungültig -> Prüfg auf neg. Rückg.wert!
    }

Es wird eine Methode public void checkSozVersNr(String sozVersNr) throws BadSvNrException (und zugehörige Exception) implementiert

2. ArrayList-basierte Firma2

Erstelle eine neue Klasse Firma2, in der die Mitarbeiter statt in einem Array in einer ArrayList verwaltet werden. Es ist sicherzustellen, dass die SozVersNr eindeutig ist.

Methoden siehe UML-Diagramm.

Suchmethoden liefern ein Set zurück!

Print-Methode ist static und erhält eine Collection (Super-Interface von List und Set) als Parameter. Daher können sowohl Listen als auch Sets übergeben werden.

3. Set-basierte Firma3

Hier ist die Eindeutigkeit der SozVersNr automatisch gegeben. Der Rückgabewert beim Einfügen liefert die Information, ob alles geklappt hat. Mit Methode contains(..) lässt sich vorab klären, ob ein Mitarbeiter schon vorhanden ist. Dabei wird im Hintergrund die Methode equals(..) der Klasse Mitarbeiter verwendet.

Wichtig dabei ist:

  • die Reihenfolge in einem "normalen" Set ist undefiniert

  • über ein Set kann nur mit einem For-Each (Java: enhanced FOR) oder mit Iteratoren iteriert werden.

  • wenn Sortierung benötigt wird, müsste ein TreeSet verwendet werden. Dieses implementiert zusätzlich die Interface NavigableSet (das seinerseits SortedSet erweitert). Damit sind Methoden wie first(), last(), lower(), higher(), …​ verfügbar.

ist derzeit nicht gefordert!

Erstelle eine neue Klasse Firma3, in der die Mitarbeiter in einer HashMap verwaltet werden. Key ist die SozVersNr (obige Klasse!).

Es gelten die gleichen Hinweise wie oben.

4. Test-Klasse oder Unit-Tests

Bitte viele (im besten Fall alle) Methoden testen (auch mit ungültigen Werten, um die Exceptions zu "sehen").

Die Print-Methode soll sowohl mit Suchergebnissen als auch mit dem gesamten Bestand getestet werden (bei Bedarf Methoden erstellen - z.B. public List<Mitarbeiter> mitarbeiterListe())