Lab-05 — List, Set, Map (Erweiterung Lab-04)

1. Erweiterung Klasse Mitarbeiter

Die Sozialversicherungsnummer wird als identifizierendes Merkmal verwendet.

Damit diese 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 InvalidSvNrExceptionFirma2mitarbeiterListe: List<Mitarbeiter>Konstruktoren()einstellen(mitarb: Mitarbeiter): MitarbeiteranzMitarb(): intentlassen(sozVersNr: SozVersNr): booleansucheMitarbMitNamensbeginn(beginn: String): Set<Mitarbeiter>sucheMitarbAbGehalt(float gehalt): Set<Mitarbeiter>printMitarbeiter(mitarbColl: Collection<Mitarbeiter>)Firma3mitarbeiterPerSvNrMap: Map<SozVersNr, 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»

Dazu wird auch die eingebaute Prüfziffer kontrolliert. 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. Eine Möglichkeit dazu ist z.B.:

    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. HashMap-basierte Firma3

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

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())

Iteration über Maps erfolgt z.B. in Form von:

in Arbeit ...