Java Salaris optellen van alle medewerkers

Status
Niet open voor verdere reacties.

johnstuck

Gebruiker
Lid geworden
22 okt 2013
Berichten
10
Dag beste forum mensen ik zit met een probleempje

Ik maak gebruik van 3 classes: Salaris,Medewerkers en Afdeling

Alle gegevens worden toegevoegd in Medewerkers inclusief het salaris
Dan voeg ik de gegevens toe aan de afdelings classe

Maar vanaf hier wil ik alle salarisen van de medewerkers kunnen optellen dat niet echt lukt tot mijn spijt

Ik gebruik de volgende code voor de volgende 3 classes:

Classe Salaris:

Code:
import java.util.*;

public class Salaris {
    
private int Salaris;
//constructor
    public Salaris( int Salaris ){
       //Accolade
        this.Salaris = Salaris;
        

    }
    
     public void getInfo(){
        System.out.println( "Salaris" );
        System.out.println( "======================================================" );
        System.out.println(Salaris);
    }
    
    public int getSalaris() {
        return this.Salaris;
    }
    
    public void print(){
        System.out.println( "Salaris:" );
            System.out.println( Salaris );
        }
    }

Classe: Medewerker

Code:
/**
 * Write a description of class Medewerker here.
 * 
 */
public class Medewerker
{
    //attributen
    private String MedewerkerID;
    private String naam;
    private String achternaam;
    private String geslacht;
    private Salaris salaris;

    //constructor
    public Medewerker( String MedewerkerID,String naam, String achternaam, String geslacht, Salaris salaris )
    {
        this.MedewerkerID = MedewerkerID;
        this.naam =  naam;
        this.achternaam = achternaam;
        this.geslacht = geslacht;
        this.salaris = salaris;
    }
    
     public void getInfoall(){
		 System.out.println(MedewerkerID +" "+ naam +" "+ achternaam +" "+ geslacht +" "+ geslacht);
	}
    
    //methoden (hiermee roep je de gegevens mee aan)
    public String getNaam()
    {
        return naam;
    }
    
      public String getmwID()
    {
        return MedewerkerID;
    }
    
    public String getAchternaam()
    {
        return achternaam;
    }
    
        public String getGeslacht()
    {
        return geslacht;
    }
    
        public Salaris getsalaris()
    {
        return salaris; 
    }
    
    //het onderste is dus een manier om een nieuwe variable in te voeren 
    //OF als dit al ingevoerd is, om te wijzigen
    public void setNaam( String naam ) 
    {
        this.naam = naam;
    }
    
        public void setAchternaam( String achternaam ) 
    {
        this.achternaam = achternaam;
    }
    
        public void setGeslacht( String geslacht ) 
    {
        this.geslacht = geslacht;
    }
    
       public int getsalarismw() {
        return this.salaris.getSalaris();
   
}
    
}

Classe: Afdeling

Code:
/**
 */
import java.util.*;

public class Afdeling
{
    private ArrayList<Medewerker> lijst;
    
    public Afdeling()
    {
        lijst = new ArrayList<Medewerker>();
    }
    
    public void voegtoe( Medewerker lid )
    {
        lijst.add( lid );
    }
    
    public void MedewerkerInformatie()
    {
        System.out.println( "Indeling van deze afdeling:" );
        System.out.println( "Naam, Achternaam, Geslacht en Salaris p.m." );
        for ( Medewerker lid : lijst ) 
        {
            System.out.println( lid.getmwID() +" "+ lid.getNaam() +" "+ lid.getAchternaam() +" "+ lid.getGeslacht() +" "+ lid.getsalarismw() );
        }
        System.out.println( "-----------------------------------------------" );
    }
    
    //extraatje toegevoegd zoeken op basis van IDNummer
    public Medewerker zoek_op_ID ( String MedewerkerID ) {
        Medewerker gezochteMedewerker = null;
        for( Medewerker lid : lijst ){
            if( lid.getmwID() == MedewerkerID  )//bepaalt wat er ingevoerd moet worden
                gezochteMedewerker = lid;
        }

        return gezochteMedewerker;
    }
    
}

Hierin moet ik een code verzinnen om het salaris bij elkaar te kunnen optellen

Ik zoek een manier om de optelling te laten plaats vinden in de Afdelingen Class
 
Laatst bewerkt:
Welke functie gebruik je nu om de optelling plaats te laten vinden?

Wat lukt er precies niet? Krijg je foutmeldingen?
 
Beste, Killermenace

Het probleem is dat ik nog geen functie heb met optellen van het totaal aantal salaris
Maar ik weet ook niet zo goed hoe ik dat zou kunnen maken.

Ik dacht eerst aan optellen van dezelfde waarde maar dat lukte ook niet helemaal
 
Ik neem aan dat je nu het volgende doet:

Medewerker objNaam = new Medewerker(1,jan, klaassen, man, new Salaris('1500') );

Alleereerst het volgende:
  • De salaris klasse kan in zijn geheel weg, deze functies kan je in de klasse medewerker doen met een simpele variabele.

Dan het antwoord op uw vraag:

Om het salaris van meerdere medewerkers op te tellen moet je deze eerst in een array of arralist zetten.
Als je al een aantal medewerkers hebt gemaakt dan kan dat zo:

[JS]ArrayList<Medewerker> medewerkers = new ArrayList<Medewerker>();[/JS]

Vervolgens voeg je dan medewerkers toe met het volgende stukje code:

[JS]medewerkers.add(objNaam);[/JS]

Waar objNaam de naam van het object is dat je hebt aangemaakt volgens mijn assumptie (bovenin)

Om dan het salaris van alle medewerkers weer te geven / op te tellen heb je een loop nodig:

[JS]for(Medewerker m:medewerkers){

}[/JS]
Daar staat dus, voor iedere medewerker (als m) in medewerkers (de array)

Nu kunt u dus, als we even uitgaan van uw voorbeeld met 3 klasse de volgende loop maken om alles op te tellen:
[JS]
int totaal = 0;
for(Medewerker m:medewerkers){
totaal = totaal + m.getsalarismw();
}[/JS]


[edit]
Als je echter salaris toch in de medewerkers klasse wilt zetten dan krijg je de volgende complete klasses:

de main klasse (waar je de tests doet):
[CPP]
Medewerker a = new Medewerker("1","jan", "klaassen", "man", 1500 );
Medewerker b = new Medewerker("2","jan2", "klaassen", "man", 1800 );
Medewerker c = new Medewerker("3","jan3", "klaassen", "man", 1900 );
Medewerker d = new Medewerker("4","jan4", "klaassen", "man", 2200 );

ArrayList<Medewerker> medewerkers = new ArrayList<Medewerker>();

medewerkers.add(a);
medewerkers.add(b);
medewerkers.add(c);
medewerkers.add(d);

double totaal = 0;
for(Medewerker m:medewerkers){
totaal = totaal + m.getsalaris();
}
System.out.println(totaal);[/CPP]

De medewerker klasse:

[CPP]public class Medewerker {
// attributen
private String MedewerkerID;
private String naam;
private String achternaam;
private String geslacht;
private double salaris;

// constructor
public Medewerker(String MedewerkerID, String naam, String achternaam,
String geslacht, double salaris) {
this.MedewerkerID = MedewerkerID;
this.naam = naam;
this.achternaam = achternaam;
this.geslacht = geslacht;
this.salaris = salaris;
}

public void getInfoall() {
System.out.println(MedewerkerID + " " + naam + " " + achternaam + " "
+ geslacht + " " + geslacht);
}

// methoden (hiermee roep je de gegevens mee aan)
public String getNaam() {
return naam;
}

public String getmwID() {
return MedewerkerID;
}

public String getAchternaam() {
return achternaam;
}

public String getGeslacht() {
return geslacht;
}

public void setNaam(String naam) {
this.naam = naam;
}

public void setAchternaam(String achternaam) {
this.achternaam = achternaam;
}

public void setGeslacht(String geslacht) {
this.geslacht = geslacht;
}

public double getsalaris() {
return this.salaris;
}

}[/CPP]
[/edit]
 
Laatst bewerkt:
De TS past mijns inziens objectgeorienteerd programmeren gewoon goed toe en er is dan ook zeker niks mis met die extra abstractie van een salaris. Want hoewel je uiteraard ook gewoon een double voor het salaris kunt gebruiken en dat ook niet per definitie verkeerd is, is het niet echt een robuust ontwerp. Zo lijkt het me best een logische vervolgstap dat er besloten wordt het eurosymbool voor het salaris te tonen. Dat is uiteraard ook op te lossen door er gewoon een euroteken voor te zetten, en dat hoeft wederom ook niet per definitie verkeerd te zijn. Maar hoort de representatie van het salaris eigenlijk wel tot de verantwoording van een medewerker? In het geval van een enkel eurosymbool voor het salaris maakt het antwoord eigenlijk niet zoveel uit. Maar wanneer je daar iets als i18n ondersteuning aan toevoegt begin je naar mijn mening eigenlijk te merken dat je functionaliteit aan het toevoegen bent die eigenlijk los van die klasse zelf staat (ze horen er niet echt thuis en hebben vaak ook het gevolg dat je vreemde constructies moet bedenken vind ik).


@TS:
Ik heb geen idee hoe lang je al programmeert, dus wellicht dat wat ik zeg je reeds bekend is. Maar je kunt bijvoorbeeld de generiekheid van je ontwerp verbeteren (het tonen van de info is nu gekoppeld aan System.out.println() en zal dus niet overal werken) door bijvoorbeeld de toString() method te gebruiken van het leveren van deze informatie. En een beetje afhankelijk van het formaat is de keuze voor een String als datatype voor medewerkerid niet de meest geschikte keuze. Deze hoort namelijk uniek voor iedere medewerker te zijn en het is daarom wellicht makkelijker een numeriek datatype te gebruiken die je gewoon telkens met één kan verhogen (kan ook intern via een algoritme worden omgezet naar een ander formaat string als dat nodig zou zijn). En door deze functionaliteit door de klasse zelf af te handelen (static) hoef je dit niet expliciet te doen en verhoog je de flexibiliteit/betrouwbaarheid. Nu moet je er namelijk voor zorgen dat je op iedere plek waar je een medewerker zou willen aanmaken de functionaliteit voor het genereren van de id's beschikbaar moet maken, terwijl dat eigenlijk helemaal niet nodig is.

Hieronder vind je een voorbeeld van hoe zo'n implementatie er mogelijk uit zou kunnen zien:

[cpp]
// Geslacht.java
public enum Geslacht {
MAN, VROUW, ONBEKEND
}

// Salaris.java
public class Salaris {

private static final String STANDAARD_LOCALE = "NL";

private Locale locale;
private double salaris;

public Salaris() {
this(0);
}

public Salaris(double salaris) {
this(salaris, new Locale(STANDAARD_LOCALE.toLowerCase(), STANDAARD_LOCALE));
}

public Salaris(double salaris, Locale locale) {
this.salaris = salaris;
this.locale = locale;
}

public void setSalaris(double salaris) {
this.salaris = salaris;
}

public double getSalaris() {
return salaris;
}

@Override
public String toString() {
Currency c = Currency.getInstance(locale);
NumberFormat nf = NumberFormat.getInstance(locale);
return String.format("Salaris: %s %s", c.getSymbol(), nf.format(salaris));
}
}


// Medewerker.java
public class Medewerker {

private static int medewerkerId = 1;

private int id;
private String naam;
private String achternaam;
private Geslacht geslacht;
private Salaris salaris;

private static int nextMedewerkerId() {
return medewerkerId++;
}

public Medewerker(String naam, String achternaam, Geslacht geslacht, double salaris) {
this(naam, achternaam, geslacht, new Salaris(salaris));
}

public Medewerker(String naam, String achternaam, Geslacht geslacht, Salaris salaris) {
this(nextMedewerkerId(), naam, achternaam, geslacht, salaris);
}

public Medewerker(int id, String naam, String achternaam, Geslacht geslacht, double salaris) {
this(id, naam, achternaam, geslacht, new Salaris(salaris));
}

public Medewerker(int id, String naam, String achternaam, Geslacht geslacht, Salaris salaris) {
this.id = id;
this.naam = naam;
this.achternaam = achternaam;
this.geslacht = geslacht;
this.salaris = salaris;
}

public int getId() {
return id;
}

public void setNaam(String naam) {
this.naam = naam;
}

public String getNaam() {
return naam;
}

public void setAchternaam(String achternaam) {
this.achternaam = achternaam;
}

public String getAchternaam() {
return achternaam;
}

public void setGeslacht(Geslacht geslacht) {
this.geslacht = geslacht;
}

public Geslacht getGeslacht() {
return geslacht;
}

public void setSalaris(Salaris salaris) {
this.salaris = salaris;
}

public Salaris getSalaris() {
return salaris;
}

@Override
public String toString() {
return String.format("[Medewerker: %d, %s %s, %s, %s]",
id, naam, achternaam, geslacht.toString(), salaris);
}
}


// Afdeling.java
public class Afdeling {

private final Set<Medewerker> medewerkers;

public Afdeling() {
this.naam = naam;
medewerkers = new HashSet<>();
}

public boolean addMedewerker(Medewerker medewerker) {
return medewerkers.add(medewerker);
}

public Medewerker zoekMedewerkerOpId(final int id) {
try {
return medewerkers.stream().filter(m -> m.getId() == id).findAny().get(); // behoort sinds Java 8 ook tot de opties
} catch (NoSuchElementException ex) {
return null;
}
}

public Salaris getTotaalAanSalarissen() {
return new Salaris(medewerkers.stream().mapToDouble(m -> m.getSalaris().getSalaris()).sum()); // behoort sinds Java 8 ook tot de opties
}

@Override
public String toString() {
return String.format("[Afdeling: %d medewerkers]", medewerkers.size());
}
}
[/cpp]
 
@COD_NL

Ik raad de salaris class af omdat deze niets anders doet dan 1 waarde bewaren en teruggeven in het geval van de TS.

Hoewel de rest van wat je zegt klopt, denk ik niet dat het handig is om alle code van de TS uit het raam te gooien.
Ik denk dat de TS nog niet zo ver is (vandaar de vraag), de code nu compleet veranderen is dan wellicht ook niet al te handig voor de TS.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan