Iteracja po hashtable

0

Witam,
Mam problem z częścią kodu, w którym staram się przeiterować po hashtbale:

Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>> ekstensje = new Hashtable<>();

w taki sposób, aby dla móc globalnie dla każdej obiektu z wszystkich klas, które znajdują się w ekstensji, zmienić pensje metodą:

public void setPensja(double nowaPensja) {
        this.pensja = nowaPensja;
    }

Poniżej załączam cały kod programu:

Klasa Pracownik:

import java.util.*;

public abstract class Pracownik extends ObjectPlus{

    private static final long serialVersionUID = 1L;

    private static ArrayList<Pracownik> pracownicy = new ArrayList<>();

    public Pracownik(){}

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String imie;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String nazwisko;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String pesel;

    // atrybut złożony, wymagany, pojedynczy, obiektu
    protected Date dataurodzenia;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String numerKontaBankowego;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String ulica;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected int numerDomu;

    // atrybut prosty, opcjonalny, pojedynczy, obiektu
    protected int numerMieszkania;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String miejscowosc;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String kodPocztowy;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected String telefonKontaktowy;

    // atrybut złożony, wymagany, pojedynczy, obiektu,
    protected Date dataRozpoczeciaWspolpracy;

    // atrybut złożony, opcjonalny, pojedynczy, obiektu,
    protected Date dataZakonczeniaWspolpracy;

    // atrybut prosty, wymagany, pojedynczy, obiektu
    protected double pensja;

    // atrybut prosty, opcjonalny, wyliczalny, pojedynczy, obiektu
    protected double premia;

    // atrybut klasowy
    protected static String adresFirmy;


    Pracownik(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
              String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
              String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
              Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika)
    {
        super();

        dodajPracownik(this);

        /**
         *  każdy z wymaganych atrybutów musi zostać
         *  podany podczas tworzenia pracownika
         */
        if(imiePracownika == null)
        {
            throw new NullPointerException("Proszę podać Imię Pracownika");
        }

        if(nazwiskoPracownika == null)
        {
            throw new NullPointerException("Proszę podać Nazwisko Pracownika");
        }

        if(peselPracownika == null)
        {
            throw new NullPointerException("Proszę podać PESEL Pracownika");
        }

        if(dataUrodzeniaPracownika == null)
        {
            throw new NullPointerException("Proszę podać datę urodzenia Pracownika");
        }

        if(numerKontaBankowegoPracownika == null)
        {
            throw new NullPointerException("Proszę podać nr konta Pracownika");
        }

        if(ulicaPracownika == null)
        {
            throw new NullPointerException("Proszę podać ulicę zamieszkania Pracownika");
        }

        if(numerDomuPracownika == 0)
        {
            throw new NullPointerException("Proszę podać numer domu Pracownika");
        }

        if(miejscowoscPracownika == null)
        {
            throw new NullPointerException("Proszę podać miejscowość Pracownika");
        }

        if(kodPocztowyPracownika == null)
        {
            throw new NullPointerException("Proszę podać kod pocztowy Pracownika");
        }

        if(telefonKontaktowyPracownika == null)
        {
            throw new NullPointerException("Proszę podać telefon kontaktowy Pracownika");
        }

        if(dataRozpoczeciaWspolpracyPracownika == null)
        {
            throw new NullPointerException("Proszę podać datę rozpoczęcia współpracy Pracownika");
        }

        if(pensjaPracownika == 0)
        {
            throw new NullPointerException("Proszę podać wysokość pensji Pracownika");
        }

        this.imie = imiePracownika;
        this.nazwisko = nazwiskoPracownika;
        this.pesel = peselPracownika;
        this.dataurodzenia = dataUrodzeniaPracownika;
        this.numerKontaBankowego = numerKontaBankowegoPracownika;
        this.ulica = ulicaPracownika;
        this.numerDomu = numerDomuPracownika;
        this.miejscowosc = miejscowoscPracownika;
        this.kodPocztowy = kodPocztowyPracownika;
        this.telefonKontaktowy = telefonKontaktowyPracownika;
        this.dataRozpoczeciaWspolpracy = dataRozpoczeciaWspolpracyPracownika;
        this.pensja = pensjaPracownika;
        this.adresFirmy = "ul. Krucza 24, 01-423 Warszawa";

    }

    /**
     *  uzupełenienie obiektu pracownik o atrybuty opcjonalne
     */
    public void wstawNumerMieszkaniaPracownika(int numerMieszkaniaPracownika){
        this.numerMieszkania = numerMieszkaniaPracownika;
    }

    public void wstawDateZakonczeniaWspolpracy(Date dataZakonczeniaWspolpracyPracownika)
    {
        this.dataZakonczeniaWspolpracy = dataZakonczeniaWspolpracyPracownika;
    }

    public String getImie()
    {
        return this.imie;
    }

    /**
     * METODA KLASOWA:
     * modyfikacja pensji pracowników o podaną wartość (w procentach)
     */

    public static void podwyzka(double wysokoscPodwyzki) throws Exception {
        // Dla każdego pracownika w ekstensji
        if (wysokoscPodwyzki < 0.01 || wysokoscPodwyzki > 0.1){
            throw new Exception("Podwyżka pensji dla wszystkich pracowników musi mieścić się w przedzialę miedzy 1% a 10%");
        }
        for(Pracownik pracownik : pracownicy)
        {
            pracownik.setPensja((1 + wysokoscPodwyzki) * pracownik.getPensja());
        }
    }

    public double getPensja() {
        return pensja;
    }

    public void setPensja(double nowaPensja) {
        this.pensja = nowaPensja;
    }


    /**
     * METODA POLIMORFICZNA, ABSTRAKCYJNA:
     */
    abstract void obliczWysokoscPremii();

    public double getPremia() {
        return premia;
    }

    public void setPremia(double wysokoscPremii) {
        this.premia = wysokoscPremii;
    }


    /**
     * przesloniecie metody "toString()"
     */
    public String toString(){
        String pracownik = new String();
        pracownik += "Imię: "+this.imie;
        pracownik += "\nNazwisko: " + this.nazwisko;
        pracownik += "\nPESEL: "+ this.pesel;
        pracownik += "\nAdres: "+ this.ulica + " " + this.numerDomu + "/" + this.numerMieszkania;
        pracownik += "\n\t   " + this.kodPocztowy + " " + this.miejscowosc;
        pracownik += "\nPensja: " + this.getPensja();
        pracownik += "\nPremia: " + this.getPremia();
        pracownik += "\n\nData zatrudnienia: " + this.dataRozpoczeciaWspolpracy;
        pracownik += "\nAdres firmy: " + this.adresFirmy;

        return pracownik;
    }






    private static void dodajPracownik(Pracownik pracownik) {

        pracownicy.add(pracownik);
    }

    private static void usunPracownik(Pracownik pracownik){
        pracownicy.remove(pracownik);
    }
}

Klasa Przewodnik:

import java.util.Date;

public class Przewodnik extends Pracownik{

    private static final long serialVersionUID = 1L;

    Przewodnik(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
              String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
              String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
              Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika) {

        super(imiePracownika, nazwiskoPracownika, peselPracownika, dataUrodzeniaPracownika, numerKontaBankowegoPracownika,
                ulicaPracownika, numerDomuPracownika, miejscowoscPracownika, kodPocztowyPracownika, telefonKontaktowyPracownika,
                dataRozpoczeciaWspolpracyPracownika, pensjaPracownika);
    }

    protected int iloscOprowadzonychWystaw;

    public double getIloscOprowadzonychWystaw() {
        return iloscOprowadzonychWystaw;
    }

    public void setIloscOprowadzonychWystaw(int liczbaOprowadzen) {
        this.iloscOprowadzonychWystaw = liczbaOprowadzen;
    }


    /**
     * POLIMORFIZM METODY
     */
    @Override
    void obliczWysokoscPremii()
    {
        this.setPremia(this.iloscOprowadzonychWystaw * 25.00);
    }
}

Klasa Renowator:

import java.util.*;

public class Renowator extends Pracownik{


    private static final long serialVersionUID = 1L;

    Renowator(String imiePracownika, String nazwiskoPracownika, String peselPracownika, Date dataUrodzeniaPracownika,
               String numerKontaBankowegoPracownika, String ulicaPracownika, int numerDomuPracownika,
               String miejscowoscPracownika, String kodPocztowyPracownika, String telefonKontaktowyPracownika,
               Date dataRozpoczeciaWspolpracyPracownika, double pensjaPracownika) {

        super(imiePracownika, nazwiskoPracownika, peselPracownika, dataUrodzeniaPracownika, numerKontaBankowegoPracownika,
                ulicaPracownika, numerDomuPracownika, miejscowoscPracownika, kodPocztowyPracownika, telefonKontaktowyPracownika,
                dataRozpoczeciaWspolpracyPracownika, pensjaPracownika);


    }

    /**
     * Atrybut prosty, powtarzalny, obiektu
     */
    protected List<Double> ocenyZaRenowacje = new ArrayList<>();

    public double getSredniaOcen(List<Double> oceny) {

        Double suma = 0.00;
        if(!oceny.isEmpty()) {
            for (Double ocena : oceny) {
                suma += ocena;
            }
            return suma.doubleValue() / oceny.size();
        }
        return suma;
    }


    /**
	 * PRZECIAZANIE METODY:
	 */
    public void dodajOceneZaRenowacje(double ocena) throws Exception
    {
        if(ocena < 2 || ocena > 5)
        {
            throw new Exception("Podaj ocenę z przedziału 1, a 5");
        }
        ocenyZaRenowacje.add(ocena);
    }
    public void dodajOceneZaRenowacje(int ocena) throws Exception
    {
        if(ocena < 2 || ocena > 5)
        {
            throw new Exception("Podaj ocenę z przedziału 1, a 5");
        }
        ocenyZaRenowacje.add((double) ocena);
    }

    /**
     * POLIMORFIZM METODY
     */
    @Override
    void obliczWysokoscPremii()
    {
        double srednia = this.getSredniaOcen(this.ocenyZaRenowacje);
        int waga = 0;
        int liczbaRenowacji = this.ocenyZaRenowacje.size();

        if (srednia  <= 3)
            waga = 0;
        else if (srednia > 3 && srednia <= 4)
            waga = 1;
        else if (srednia > 4)
            waga = 2;

        this.setPremia(liczbaRenowacji * 20.00 * waga);
    }
}

Klasa ObjectPlus:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Hashtable;
import java.util.Vector;

public class ObjectPlus implements Serializable{

    private static final long serialVersionUID = 1L;

    protected static Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>> ekstensje = new Hashtable<>();


    public ObjectPlus()
    {
        Vector<ObjectPlus> ekstensja = null;
        Class<? extends ObjectPlus> klasa = this.getClass();

        //sprawdzam czy dana klasa istnieje w kolekcji ekstensji
        //jeśli jest, to ją wyciągam...
        if(ekstensje.containsKey(klasa))
        {
            ekstensja = ekstensje.get(klasa);
        }
        else
        {
            //jeśli nie ma, to dodaję nową klasę do kolekcji ekstensji
            ekstensja = new Vector<ObjectPlus>();
            ekstensje.put(klasa, ekstensja);
        }
        //dodaję do wyciągniętej z ekstensji klasy nowy obiekt danej klasy
        ekstensja.add(this);
    }


    // zapis wszystkich ekstensji do podanego strumienia (zgodność z numerem serializacji)
    public static void zapiszEkstensje(ObjectOutputStream stream) throws IOException
    {
        //zapis ekstensji w formie tekstu
        stream.writeObject(ekstensje);
    }

    //odczyt wszystkich ekstensji z podanego strumienia (zgodność z numerem serializacji)
    public static void odczytajEkstensje(ObjectInputStream stream) throws IOException, ClassNotFoundException
    {
        //odtworzenia danych z tekstu
        ekstensje = (Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>>) stream.readObject();
    }

    //wyświetlenie ekstensji
    public static void pokazEkstensje(Class<? extends ObjectPlus> klasa) throws Exception
    {

        Vector<ObjectPlus> ekstensja = null;

        if(ekstensje.containsKey(klasa))
        {
            // Ekstensja tej klasy istnieje w kolekcji ekstensji
            ekstensja = ekstensje.get(klasa);
        }
        else
        {
            throw new Exception("Nieznana klasa " + klasa);
        }

        System.out.println("Ekstensja klasy: " + klasa.getSimpleName());

        for(Object obiekt : ekstensja)
        {
            System.out.println(obiekt + "\n\n");
        }
    }
}

Klasa Main:

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    public static void main (String args[]) throws Exception{

        final String stream = "...";
        Date date = new Date();

        //stworzenie obiektu klasy Przewodnik
        Przewodnik przewodnik = new Przewodnik("Halina", "Kowalska",
                "02020202020", date, "PL00 1111-2222-3333-4444-5555-6666",
                "Aleje Jerozolimskie", 61, "Warszawa",
                "00-697", "500-500-500", date, 5000.00);

        //dodwanie atrybutu opcjonalnego "numerMieszkania"
        przewodnik.wstawNumerMieszkaniaPracownika(10);

        //dodanie atrybutu obiektu "iloscOprowadzonychWystaw"
        przewodnik.setIloscOprowadzonychWystaw(10);

        //uzycie metody abstrakcyjnej
        przewodnik.obliczWysokoscPremii();


        //stworzenie obiektu klasy Renowator
        Renowator renowator = new Renowator("Janusz", "Kowalski",
                "01010100000", date, "PL01 1111-2222-3333-4444-5555-6666",
                "Polnej Szosy", 1, "Warszawa", "00-001",
                "600-600-600", date, 4500.00);

        /**
        //dodwanie atrybutu opcjonalnego "numerMieszkania"
        renowator.wstawNumerMieszkaniaPracownika(23);

        //uzycie metody przeciążonej "dodajOceneZaRenowacje()"
        renowator.dodajOceneZaRenowacje(2);
        renowator.dodajOceneZaRenowacje(3);
        renowator.dodajOceneZaRenowacje(3.3);
        renowator.dodajOceneZaRenowacje(4.5);
        renowator.dodajOceneZaRenowacje(5);

        //wyliczenie sredniej z ocen
        renowator.getSredniaOcen(renowator.ocenyZaRenowacje);

        //uzycie metody abstrakcyjnej
        renowator.obliczWysokoscPremii();

        Pracownik.podwyzka(0.1);
        */


        // odczyt ekstensji z pliku

        try {
            FileInputStream fileIn = new FileInputStream(stream);
            ObjectInputStream inputStream = new ObjectInputStream(fileIn);
            ObjectPlus.odczytajEkstensje(inputStream);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }


        // wyswietlenie wszystkich dodanych pracownikow z danej klasy
        ObjectPlus.pokazEkstensje(Przewodnik.class);
        ObjectPlus.pokazEkstensje(Renowator.class);


        //zapis ekstensji do pliku
        try
        {
            //wskazanie sciezki do pliku
            FileOutputStream fileOut = new FileOutputStream(stream);
            ObjectOutputStream outStream = new ObjectOutputStream(fileOut);

            //zapis do pliku
            ObjectPlus.zapiszEkstensje(outStream);
            outStream.close();
            fileOut.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

Na chwilę obecną rozwiązałem problem poprzez dodanie w klasie Pracownik nowej tablicy, do której dodatkowo dodaje utworzone obiekty klas Przewodnik i Renowator, a następnie w mainie wywołuję:

public static void podwyzka(double wysokoscPodwyzki) throws Exception {
        // Dla każdego pracownika w ekstensji
        if (wysokoscPodwyzki < 0.01 || wysokoscPodwyzki > 0.1){
            throw new Exception("Podwyżka pensji dla wszystkich pracowników musi mieścić się w przedzialę miedzy 1% a 10%");
        }
        for(Pracownik pracownik : pracownicy)
        {
            pracownik.setPensja((1 + wysokoscPodwyzki) * pracownik.getPensja());
        }
    }

ale z pewnością jest to bez sensu skoro na pewno da się normalnie przelecieć przez wszystkie obiekty z hastbale.
Problem tylko polega na tym, że nie wiem jak...
Początkowo próbowałem w ten sposób:

public void raise(double nowaPensja){
    Set<Class<? extends ObjectPlus>> keys = extensions.keySet();

    for (Class<? extends ObjectPlus> key : keys){
        extensions.get(key).setPensja(nowaPensja);
    }
}

ale oczywiście bez skutku.

0

Może takie cuś:

for (Map.Entry<Class<? extends ObjectPlus>, Vector<ObjectPlus>> e : ekstensje.entrySet()) {
    ...
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1