[informatica] hulp bij het opslaan in arraylist java

Moderators: ArcherBarry, Fuzzwood

Berichten: 35

hulp bij het opslaan in arraylist java

hallo

Voor ons project voor java moeten moeten we een aantal uurwerken maken.

Deze moeten met een decorator pattern gemaakt worden.

Nu heb ik al een reeks uurwerken gemaakt met een abstracte klasse en enkele concrete classes en dit ging perfect om in een arraylist op te slaan.

Nu zijn we van enkele simpele oefeningen overgegaan op een patterns,en dit is toch direct een stap hoger.

In bijlage heb ik mijn voorlopig project steken,en er moet nog veel aan veranderd worden.

Het is een gezipt bestand vanuit eclipse dus direct te importeren.

Maar graag had ik geweten of iemand me kan helpen met de gemaakte uurwerken in een array op te slaan om later over te itereren?

In vorige opgaven maakte ik in de classe een arraylist,en add de gemaakte objecten direct.

Maar nu met een Decorator pattern een een interface werkt dit dus niet zo gemakkelijk.

Ik kan hier mijn code niet pasten omdat het al teveel is om overzichtelijkte houden.

Alvast bedankt aan diegene die wil kijken =D>
uurwerken.zip
(47.33 KiB) 147 keer gedownload
mvg b,

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

Het is mij niet duidelijk wat je nou precies wilt. Verder herken ik ook geen Decorator Pattern in je code. Kun je je vraag verduidelijken (of de opdracht posten of zo).

Berichten: 35

Re: hulp bij het opslaan in arraylist java

Hallo

De opdracht was maak enkele uurwerken en voeg wat code toe die we in de les gezien hebben.

Dus in de winkel krijg ik een aanvraag voor een uurwerk(de main).

Deze geeft de opdracht door aan de configurator classe die de opties van het uurwerk bevraagt.

Die opties worden meegegeven bij de aanroep van de methode in de fabriek classe.

Code: Selecteer alles


public static void maakHorloges(String soort, String datum, String timer,String zonnestand) {

De interface Iwekker heeft een methode string geefOmschrijving.

De abstracte klasse ADecorator implements de interface IWekker en maakt een object van IWekker.

De datum,zonnestand en timers zijn een afgeleide van de decorator en worden gebruikt om in de fabriek toe te passen bij het maken van een uurwerk en zo het decorator pattern toe te passen

Code: Selecteer alles


IWekker standaardHorloge = new Timers(new Zonnestand(new Datum(new AnaloogPolshorloge())));

De klasse Ahorloge is een abstracte klasse waarbij de tijd zit.

Iedere afgeleide van Ahorloge heeft sowieso een tijd dus analoogpols,digitaalpols,analoogwand en digitaalwand(concreet) hebben een tijd aanduiding maar met het decorator worden de extra opties toegepast.

hopelijk is dit iets duidelijker ik heb de slechte neiging om mijn commentaar nadien bij te schrijven :?

Wat ik nu wil is de uurwerken die gemaakt worden de fabriek opslaan in een arraylist om zo te kunnen over itereren om bv te weten welke uurwerken met een datum zijn,of bv welke met een zonnestand.

Of om bepaalde uurwerken uit te halen en de tijdzone te verzetten van deze.

Dan wil ik nog het object van de arraylist opslaan op de c:/ met een serialisatie en een transient toepassen op bepaalde variabelen.

Let op sommige implementatie zoals zonnestand is genoeg met een string "dit is de zonnestand" en moeten we die niet volledig implementeren.

Er moet nog veel aan veranderen dit is nog maar de eerste dag dat ik eraan begonnen ben maar uit ondervinding weet ik dat ik meestal een versie of 8 heb voor het volledig werkt :lol:

mvg b,

Gebruikersavatar
Berichten: 3.963

Re: hulp bij het opslaan in arraylist java

Opmerking moderator

Iemand die hier nog een handje kan toesteken?
"Success is the ability to go from one failure to another with no loss of enthusiasm" - Winston Churchill

Berichten: 35

Re: hulp bij het opslaan in arraylist java

hallo

het is me gelukt om ze op te slaan in een arraylist.

op naar het volgend probleem .

Indien ik nog een probleem tegen kom zal ik het hier wel laten weten :lol:

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

Ik heb je code (eindelijk) nog eens bekeken en ik zie nog steeds niet waar je een Decorator Pattern inzet. Ik verwacht ergens een regel zoals degene die je geeft:

Code: Selecteer alles

IWekker standaardHorloge = new Timers(new Zonnestand(new Datum(new AnaloogPolshorloge())));
Jij lijkt alles te doen met 'inheritance'. Dat is echter geen Decorator Pattern.

Berichten: 35

Re: hulp bij het opslaan in arraylist java

hallo

mijn fout ooooooooooooooooooooooooooooooooo :oops: :oops: :oops: :oops: :oops:

ik heb de verkeerde zip opgeladen zie ik nu duizend maal sorry.

Dit was idd de oefening van overerving :mrgreen:

in bijlage de nieuwe versie.

mss kun je hier eens naar kijken en waar verbetering kan zal ik dit aanpassen.
Bijlagen
uurwerkenGoed.zip
(45.93 KiB) 155 keer gedownload

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

Grapjas... dat lijkt er meer op. :D

Ik vind jouw maakHorloges-methode in jouw fabriek wel onhandig. Veel te veel if-statements. Het kan makkelijker:

Code: Selecteer alles


public void maakHorloges(String soort, String datum, String timer,String zonnestand) {

  IWekker klok;

  if (soort == "analoogPols") {

klok = new AnaloogPolshorloge();

  else if (soort == "analoogWand") {

klok = new AnaloogWandHorloge();

  } else if // ... (en zo verder voor elk type)

// nu ga je de opties toevoegen. Hierbij maakt het je niet uit wat voor soort klok het is.

  if (datum == "datum") {

klok = new Datum(klok);

  }

  if (zonnestand == "zonnestand") {

klok = new Zonnestand(klok);

  }

enz.

Verder zou ik voor datum, zonnestand en timer booleans gebruiken. Voor de soorten zou ik misschien constanten definieren (en misschien alle if's dan in een switch-case stoppen).

Berichten: 35

Re: hulp bij het opslaan in arraylist java

nogmaals sorry moest je niet over inheritance gesproken hebben ging mijn euro nooit vallen :-$

hier de aangepaste syntax zo zie je maar het verschil tussen een student en iemand met meer ervaring.

Ik was aan het kijken om de syntax zo flexibel mogelijk te maken maar zo ver had ik nog niet gedacht

Code: Selecteer alles


public void maakHorloges(String soort, boolean datum, boolean timer,boolean zonnestand) {

   IWekker klok = null;

    if (soort == "analoogPols") {

    klok = new AnaloogPolshorloge();

  }

    else if (soort == "analoogWand") {

   klok = new AnaloogWandHorloge();

 }

    else if (soort == "digitaalPols") {

 klok = new DigitaalPolsHorloge();

  }

 else if (soort == "digitaalWand") {

 klok = new DigitaalWandhorloges();

   }

   if (datum == false && zonnestand == false  && timer == false){//uurwerk zonder opties

    System.out.println(klok.getOmschrijving() + " en er zijn geen opties gekozen"); 

    }

    if (datum == true && zonnestand == false && timer == false){//uurwerk met datum

   klok = new Datum(klok);

    System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> datum");

  } 

 if (datum == false && zonnestand == true && timer == false){//uurwerk met zonnestand

 klok = new Zonnestand(klok);

 System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> datum");

   } 

 if (datum == false && zonnestand == false && timer == true){//uurwerk met timer

 klok = new Timers(klok);

  System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> timer");

 }

 if (datum == true && zonnestand == true && timer == false){//uurwerk met datum en zonnestand

 klok = new Zonnestand(new Datum(klok));

 System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> datum en zonnestand");

    }

  if (datum == true && zonnestand == false && timer == true){//uurwerk met datum en timer

    klok = new Timers(new Datum(klok));

    System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> datum en timer");

   }

   if (datum == true && zonnestand == true && timer == true){//uurwerk met datum en timer en zonnestand

    klok = new Timers(new Zonnestand(new Datum(klok)));

    System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> datum en zonnestand en timer");

  }

    if (datum == false && zonnestand == true && timer == true){//uurwerk met zonnestand en timer

  klok = new Zonnestand(new Timers(klok));

  System.out.println(klok.getOmschrijving()+ " er zijn volgende opties gekozen --> zonnestand en timer");

   }

   lijstHorloges.add(klok);

 gemaakteHorloges.setHorloges(lijstHorloges);

}

maar nu ff over de switch case ik zal toch zowiezo met if's moeten blijven werken om mijn switch te bedienen?

Of zie ik er weer over

grts

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

Suggestie:

Code: Selecteer alles


public void maakHorloges(String soort, boolean datum, boolean timer,boolean zonnestand) {

   IWekker klok = null;

   if (soort == "analoogPols") {

		klok = new AnaloogPolshorloge();

	} else if (soort == "analoogWand") {

		klok = new AnaloogWandHorloge();

	} else if (soort == "digitaalPols") {

		klok = new DigitaalPolsHorloge();

	 } else if (soort == "digitaalWand") {

		klok = new DigitaalWandhorloges();

	 }

	if (datum) {//uurwerk met datum

	   klok = new Datum(klok);

	}

	if (zonnestand){//uurwerk met zonnestand

		 klok = new Zonnestand(klok);

	}

	if (timer){//uurwerk met timer

				 klok = new Timers(klok);

	}

	System.out.println(klok.getOmschrijving());

	lijstHorloges.add(klok);

	gemaakteHorloges.setHorloges(lijstHorloges);

}

Je moet er nu alleen nog voor zorgen dat "getOmschrijving" het juiste teruggeeft. Disclaimer: ik heb deze code niet getest. Ik heb deze gewoon aangepast in mijn browser (dus ik weet niet of ie zonder fouten compileert).

Berichten: 35

Re: hulp bij het opslaan in arraylist java

hallo

de code werkt maar niet zoals ze zou moeten werken

Als ik geen optie toevoeg werkt ze perfect,1 optie gaat ook nog maar als ik begin met meerdere opties toe te voegen krijg ik een probleem (geen foutmelding)

Code: Selecteer alles


maak u keuze

1 configureer een uurwerk

9 bekijk gemaakte uurwerken

10 om te serializeren

11 om te deserializeren

1

kies u uurwerk

---------------

1 voor een analoog polsuurwerk

2 voor een digitaal polsuurwerk

3 voor een analoge wandklok

4 voor een digitale wandklok

1

wenst u nog opties ja/nee

-------------------------

ja

wenst u een datum functie?(ja/nee)

ja

wenst u een zonnestand functie?(ja/nee)

nee

wenst u een timer functie?(ja/nee)

nee

optie datum

Dit is een analoog Polshorloge , de tijd is 15:38:04 de datum is 21-01-2014

//hierboven werkt het dus perfect tot met 1 optie extra

//hieronder neem ik 2 opties mee en dan krijg ik een dubbele //uitvoer

wenst u nog een uurwerk te maken?(ja/nee)

--------------------------------

ja

kies u uurwerk

---------------

1 voor een analoog polsuurwerk

2 voor een digitaal polsuurwerk

3 voor een analoge wandklok

4 voor een digitale wandklok

1

wenst u nog opties ja/nee

-------------------------

ja

wenst u een datum functie?(ja/nee)

ja

wenst u een zonnestand functie?(ja/nee)

nee

wenst u een timer functie?(ja/nee)

ja

optie datum

optie timer

optie datum

optie timer

Dit is een analoog Polshorloge , de tijd is 15:38:04 de datum is 21-01-2014 ,de timer is gezet  de datum is 21-01-2014 ,de timer is gezet

wenst u nog een uurwerk te maken?(ja/nee)

--------------------------------

Ik krijg dus een ,dubble of driedubbel uitvoer en hij schrijft enkel maar de laatste optie weg in da arraylist.

Code: Selecteer alles


public void maakHorloges(String soort, boolean datum, boolean timer,boolean zonnestand) {

   IWekker uurwerk = null;

   //we steken eerst de soort aan de hand van het gekozen horloge type in een object klok

   //die we dan meegeven en met of zonder opties in de arraylist steken

  

if (soort == "analoogPols") {//analoog polshorloge zonder opties

uurwerk = new AnaloogPolshorloge();

  }

else if (soort == "analoogWand") {//analoog wandhorloge zonder opties

   uurwerk = new AnaloogWandHorloge();

 }

else if (soort == "digitaalPols") {//digitaal polshorloge zonder opties

 uurwerk = new DigitaalPolsHorloge();

  }

 else if (soort == "digitaalWand") {//digitaal wandhorloge zonder opties

 uurwerk = new DigitaalWandhorloges();

   }

if (datum){//uurwerk met datum

   uurwerk = new Datum(uurwerk);

  }

 if (zonnestand){//uurwerk met zonnestand

 uurwerk = new Zonnestand(uurwerk);

   }

 if (timer){//uurwerk met timer

 uurwerk = new Timers(uurwerk);

 }

 if (datum && zonnestand){//uurwerk met datum en zonnestand

 uurwerk = new Zonnestand(new Datum(uurwerk));

}

  if (datum && timer){//uurwerk met datum en timer

uurwerk = new Timers(new Datum(uurwerk));

   }

 if (zonnestand && timer){//uurwerk met zonnestand en timer

  uurwerk = new Zonnestand(new Timers(uurwerk));

}

  if (datum && zonnestand && timer){//uurwerk met datum en timer en zonnestand

   uurwerk = new Timers(new Zonnestand(new Datum(uurwerk)));

 }

   //klok.getomschrijving  geeft de de omschrijving van de gemaakte klok terug.

   //klok.getOpties is gemaakt om enkel de opties mee te geven bij de gemaakte klok.

   //Ik kon ook de toString uitfilteren maar dit ging dan niet meer werken bij mijn iterator om te filter

   System.out.println(uurwerk.getOmschrijving());// + " er zijn volgende opties gekozen -->"+ uurwerk.getOpties());

   lijstHorloges.add(uurwerk);

 gemaakteHorloges.setHorloges(lijstHorloges);

}

als ik debug op de laatste sytem out zie ik dat hij nu in uurwerk x aantal keer een tempwekker steekt met x aantal keer de opties.

Code: Selecteer alles


uurwerk Timers  (id=25)		   model.concreet.extras.Timers@6f45ee7f

tempWekker Datum  (id=29)	model.concreet.extras.Datum@4e1f52a

datum "21-01-2014" (id=32)	21-01-2014

tempWekker Timers  (id=33)	model.concreet.extras.Timers@135afd61

tempWekker Datum  (id=35)	model.concreet.extras.Datum@37b24706

datum "21-01-2014" (id=37)	21-01-2014

tempWekker AnaloogPolshorloge  (id=38) model.concreet.types.AnaloogPolshorloge@1943b93b

sdf SimpleDateFormat  (id=42)   java.text.SimpleDateFormat@8140d380

tijd "15:43:02" (id=45)	15:43:02

dus de getomschrijving loopt nu inderdaad al de opties af maar dan nog eens per decorator ook.

Voorlopig terug naar de vorige versie die werkte zoals het hoort nu nog eens zoeken hoe het komt dat ik alles dubbel krijg :-)

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

dus de getomschrijving loopt nu inderdaad al de opties af maar dan nog eens per decorator ook.
De verkeerde output komt doordat je tijdens de constructie meerdere keren dezelfde decorator toevoegd. Stel dat je zowel datum als zonnestand op true hebt. Bij "if (datum)" voeg je de datum toe. Bij "if (zonnestand)" voeg je de zonnestand toe. Bij "if (datum&&zonnestand)" voeg je de datum en de zonnestand nogmaals toe. Dit moet niet. Die heb je al toegevoegd. Alle if's met dubbele opties kun je verwijderen.

Berichten: 35

Re: hulp bij het opslaan in arraylist java

ondertussen heb ik denk ik de fout gevonden maar geen oplossing.

Als ik een uurwerk kies die en een datum en een timer en een zonnestand heeft dan zijn alle statements true en print hij die ook uit omdat er nergens een fals check inzit :-)

Edit blijkbaar op hetzelfde moment aan het typen ;)

idd nu werkt het.

ff kijken of ik het snap.

Met de if else if kies je het type uurwerk (of dit type of dit etc)

Met de opties if statement kies je de opties.

Als je een datum kiest hou die bij,kies je een zonnestand hoe die ook bij en kies je een timer hou die ook bij.

Dus de if moet je hier zien als een soort "en"

Nu ff vlug de getomschrijving erbijvoegen ,maar ik merk wel op dat mijn syntax iedere bericht minder wordt :lol: en nog steeds hetzelfde uitvoert :mrgreen: .

Nog mss vlug een vraag tussendoor

In een later stadia zal ik mijn arrylist serialiseren en deserialiseren.

Veel nut zal dit niet geven in dit geval enkel omdat we dit gezien hebben wil ik dit ook toepassen.

Nu stelde ik mezelf de vraag kan ik mijn arraylist ook wegschrijven naar een leesbaar formaat,bv excel of txt of is dit al een stap te ver met mijn huidige kennis (google leverde me veel op met apache poi maar dit hebben we niet gezien).

Ik moet natuurlijk mijn eigen werk kunnen verdedigen :twisted:

grts

Berichten: 7.068

Re: hulp bij het opslaan in arraylist java

Omdat ik jouw code niet kan zien, hoop ik dat dit niet betekent dat je alleen de if's met twee elementen hebt verwijderd en die met 3 behouden hebt... dan zou je immers niet helemaal begrepen hebben wat je aan het doen bent.

Als je je code post dan kan ik (vanavond) zien wat je gedaan hebt (of misschien is het beter als je het in een zipje stopt).

Berichten: 35

Re: hulp bij het opslaan in arraylist java

nee ik heb dus dit over :lol:

Code: Selecteer alles


public void maakHorloges(String soort, boolean datum, boolean timer,boolean zonnestand) {

   IWekker uurwerk = null;

   //we steken eerst de soort aan de hand van het gekozen horloge type in een object klok

   //die we dan meegeven en met of zonder opties in de arraylist steken

  

if (soort == "analoogPols") {//analoog polshorloge zonder opties

uurwerk = new AnaloogPolshorloge();

  }

else if (soort == "analoogWand") {//analoog wandhorloge zonder opties

   uurwerk = new AnaloogWandHorloge();

 }

else if (soort == "digitaalPols") {//digitaal polshorloge zonder opties

 uurwerk = new DigitaalPolsHorloge();

  }

 else if (soort == "digitaalWand") {//digitaal wandhorloge zonder opties

 uurwerk = new DigitaalWandhorloges();

   }

if (datum){//uurwerk met datum

   uurwerk = new Datum(uurwerk);

  }

 if (zonnestand){//uurwerk met zonnestand

 uurwerk = new Zonnestand(uurwerk);

   }

 if (timer){//uurwerk met timer

 uurwerk = new Timers(uurwerk);

 }

   //klok.getomschrijving  geeft de de omschrijving van de gemaakte klok terug.

   //klok.getOpties is gemaakt om enkel de opties mee te geven bij de gemaakte klok.

   //Ik kon ook de toString uitfilteren maar dit ging dan niet meer werken bij mijn iterator om te filter

   System.out.println(uurwerk.getOmschrijving());// + " er zijn volgende opties gekozen -->"+ uurwerk.getOpties());

   lijstHorloges.add(uurwerk);

 gemaakteHorloges.setHorloges(lijstHorloges);

ik zal er nu nog wat aan verder werken,en vanavond ff zippen en uploaden

alvast bedankt voor de geboden hulp :-)

Reageer