Springen naar inhoud

hulp bij het opslaan in arraylist java



  • Log in om te kunnen reageren

#1

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 16 januari 2014 - 00:06

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>

Bijlage  uurwerken.zip   47,33K   68 maal gedownload

mvg b,

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 16 januari 2014 - 08:33

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

#3

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 16 januari 2014 - 11:22

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.
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
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,

Veranderd door rcb8dboy, 16 januari 2014 - 11:24


#4

Kravitz

    Kravitz


  • >1k berichten
  • 4042 berichten
  • Moderator

Geplaatst op 17 januari 2014 - 23:51

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

#5

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 19 januari 2014 - 20:21

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:

#6

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 20 januari 2014 - 08:08

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:
IWekker standaardHorloge = new Timers(new Zonnestand(new Datum(new AnaloogPolshorloge())));
Jij lijkt alles te doen met 'inheritance'. Dat is echter geen Decorator Pattern.

#7

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 20 januari 2014 - 11:08

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.

Bijgevoegde Bestanden


#8

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 20 januari 2014 - 11:42

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:
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).

#9

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 20 januari 2014 - 16:01

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

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

#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 20 januari 2014 - 16:17

Suggestie:
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).

#11

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 21 januari 2014 - 15:54

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

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.

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

Veranderd door rcb8dboy, 21 januari 2014 - 15:58


#12

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 21 januari 2014 - 16:11

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.

#13

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 21 januari 2014 - 16:11

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

Veranderd door rcb8dboy, 21 januari 2014 - 16:27


#14

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 21 januari 2014 - 16:28

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

Veranderd door EvilBro, 21 januari 2014 - 16:29


#15

rcb8dboy

    rcb8dboy


  • >25 berichten
  • 35 berichten
  • Gebruiker

Geplaatst op 21 januari 2014 - 16:33

nee ik heb dus dit over :lol:
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 :-)

Veranderd door rcb8dboy, 21 januari 2014 - 16:34







Also tagged with one or more of these keywords: informatica

0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures