Archief - java index +1

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

badboyss

Legacy Member
hallo


Hoe kan ik bij een array als ik bv kamer 5 bezet zet effectief ook index 5 krijg bij het opvragen van de kamer en niet 4.
Als ik nu bv x de waarde 5 geef zet hij hem op index 4 als ik [i+1] doe krijg ik natuurlijk een index out of bound omdat de laatste dan ook +1 is
dus als ik x 5 geef en later met een andere methode opvraag welke kamers bezet zijn wil ik ook index 5 krijgen en niet index 4
Dus voor alle duidelijkheid alles werkt zoals ik wil enkel mijn probleem met de index niet

Code:
public void setKamerBezet(int x, String voornaam, String naam,
			String straat, int huisnummer, String gemeente, int kamervoorkeur,
			String roker, String bad, int aantalkinderen, int pensionsoort,
			String kluis, int aantalnachten, int verblijfdatum) {

			for (int i = 0; i < kamers.length; i++)
				if (kamers[i].getKamerNummer() == x) 
                                    {
				   kamers[i].setBezet(true);
				   kamers[i].setKlantInKamer(voornaam, naam, straat,
							huisnummer, gemeente, kamervoorkeur, roker, bad,
							aantalkinderen, pensionsoort, kluis, aantalnachten,
							verblijfdatum);

				}
	}

als ik 1 meegeef met het kamernummer werkt het natuurlijk tot ik kamer 10 moet reserveren :doh:
Code:
{
					typekamer.setKamerBezet(kamernummer + 1, In.Voornaam(),
							In.FamilieNaam(), In.Straat(), In.HuisNummer(),
							In.Gemeente(), In.Kamerkeuze(), In.Roker(),
							In.Bad(), In.AantalKinderen(), In.Pension(),In.Kluis(), In.AantalNachten(), In.VerblijfDatum());
							System.out.println("Uw reservatie is voltooid.");	}
			}

grts b

ultddave

Legacy Member
Ik denk dat je het jezelf moeilijker aan het maken bent, dan wat het is.

Java gebruikt een zero-based array (zoals je zelf ook weet). Dus (indien we even veronderstellen dat de kamernummers elkaar opvolgen) dan krijg je dit:
[index: 0] -> Kamer 1
[index: 1] -> Kamer 2
[index: 2] -> Kamer 3
[index: 3] -> Kamer 4
[index: 4] -> Kamer 5

Kamer "x" zit dus op index "x - 1". Bijvoorbeeld "kamer 3" zit op index "3 - 1" oftewel 2. En dus niet +1, want dan ga je inderdaad out of bounds ;).

Dus als je een functie hebt geschreven die moet testen of een kamer met nummer "x" bezet is, dan zal die er zo uitzien:

Code:
public boolean isKamerBezet(int x)
{
   return kamers[x - 1].isBezet();
}


Indien je liever met een one-based array werkt, kan je ook het volgende doen:
[index: 0] -> leeg
[index: 1] -> Kamer 1
[index: 2] -> Kamer 2
[index: 3] -> Kamer 3
[index: 4] -> Kamer 4
[index: 5] -> Kamer 5

Met andere woorden je maakt een array aan die 1 element langer is, en dan kan je altijd je kammernummer gebruiken voor de indices. Zonder er '1' vanaf te trekken.

(Tenzij ik het probleem verkeerd begrepen heb.)

PS: Naar de toekomst toe misschien proberen om iets minder parameters aan functies mee te geven, of ze desnoods te encapsulaten in een object. Want 14 parameters is nogal veel ;).

cptKangaroo

Legacy Member
Als je de index niet echt nodig hebt en gewoon alle elementen van de array iets wil laten doen, dan kan een ForEach loop ietsje makkelijker zijn dan een ForNext. Je array type moet dan wel iterable zijn, en in Java lijkt een ForEach een beetje complexer dan wat ik in .NET gewoon ben, maar ik vermeld het toch maar even.

YaMo

Legacy Member
Het is de conventie in Java dat namen van variabelen en methodes met een kleine letter beginnen. Jij doet het precies soms met een kleine en soms met een hoofdletter, wat nog irritanter is :p

En geef objecten mee aan methodes in plaats van gigantische lijsten Strings en ints.
Ik neem aan dat de "In" uit het tweede stuk code een object van de klasse Klant ofzoiets is. Doe dan gewoon
Code:
typekamer.setKamerBezet(kamernummer, In);
maar dan met kleine letter uiteraard...

En je geeft ook al die dingen apart mee aan setKlantInKamer. Is het niet logischer als de kamer een verwijzing heeft naar het Klant object, in plaats van al die aparte elementen?

Je kan ook beter dingen zoals die "kamernummer + 1" binnen de methode zelf doen. Als jij kamer 12 op bezet wilt zetten, geef je een 12 mee aan die methode en niet een 13 omdat je nu toevallig een datastructuur gebruikt waarbij kamer 12 op plaats 13 zit. Dat is logischer en zo vermijd je bugs als je die lijst van kamers op een andere manier gaat implementeren.

cptKangaroo zei:
Als je de index niet echt nodig hebt en gewoon alle elementen van de array iets wil laten doen, dan kan een ForEach loop ietsje makkelijker zijn dan een ForNext. Je array type moet dan wel iterable zijn, en in Java lijkt een ForEach een beetje complexer dan wat ik in .NET gewoon ben, maar ik vermeld het toch maar even.

Wat is daar complexer aan? :p

Java:
Code:
for(Object o : objects){}

C#:
Code:
foreach(Object o in objects){}

badboyss

Legacy Member
hallo all

thx voor de tips.
Het eerste jaar hbo5 avondonderwijs ;-)
Ik ben nu bezig met al de tips toe te passen op de code
De bedoeling is om zo oop en modulair mogelijk te werken.

Ivb de arraylist ik werk met een gewone array waarbij ik het aantal kamer meegeef als parameter zo kan ik indien er meerdere kamers per verdiep bijkomen enkel de parameter veranderen.
Maar de grootste reden voor een vaste index is dat als bv een klant uitboekt verdwijnt de klant uit de array.
Dus als ik kamer 1 klant a /2 kl b / 3 kl c /4 kl d heb en ik boek klb uit blijven de andere klanten op hun plaats zitten
Maar met een arraylist zullen de klant die in de kamer erachter zitten veranderd van nummer naar ik vermoed met een arraylist(correct me if i'm wrong)
Weet wel dat we nog maar halfwege zitten en nu nog maar de try catch en finaly van head first gezien hebben maar we slaan er ons wel door.

ik kan hier wel de code pasten maar het is een examen opdracht :D.
We mogen gebruik maken van hulplijnen :lol: dat is het probleem niet maar als" ik" hier lees wie weet wie nog:evil:

Dus moesten er mensen me willen helpen met sommige(de meeste klasse zijn al geschreven) verbeteringen/problemen wil ik altijd wel een linkje geven met de klasses.
Ik verwacht geen volledige oplossingen maar een duw in de juist richting is al meer dan welkom bij een probleem
Ik weet dat waarschijnlijk een doorgewinterde java programmeur soms huivert van de code van een beginner maar alle begin is moeilijk en moet geleerd worden :)

greets b,

Jerre Muesli

Legacy Member
Ik kan alleen maar aanraden om met arrays te leren werken ipv vreemde truuken toe te passen die de code onduidelijk maakt.

blackrabbit

Legacy Member
Keyword is: abstractie. Het maakt dan niet uit welke datastructuur in de achtergrond wordt gebruikt.
In dit geval ben je halverwege. Je maakt je array eigenlijk gewoon 1 element te klein.


Anyway, thread diagonaal gelezen, first thought bij probleem: waarom gebruik je geen Map?
Het 'bezet' zetten van een kamer is nu een O(n) operatie, nogal zonde imho..


Verder: heb je een UML klassediagram dat je kan delen?

cptKangaroo

Legacy Member
YaMo zei:
Wat is daar complexer aan? :p

Java:
Code:
for(Object o : objects){}

C#:
Code:
foreach(Object o in objects){}
Oops! Ik had me verkeken op dat tabelletje in de link en dacht dat er met .hasNext() en zo gewerkt moest worden :$ maar ze maken gewoon nog eens onderscheid tussen array en collection.

Jerre Muesli

Legacy Member
cptKangaroo zei:
Oops! Ik had me verkeken op dat tabelletje in de link en dacht dat er met .hasNext() en zo gewerkt moest worden :$ maar ze maken gewoon nog eens onderscheid tussen array en collection.

hasNext is een method op een iterator. Deze moet je gebruiken als je een element uit een collection wil verwijderen als je hem op dezelfde moment aan het itereren bent. Doe je dit bij een loop met syntax 'for(Type var:collection)' zal je een ConcurrentModificationException krijgen

Jerre Muesli

Legacy Member
ListIterator is voor 90% dezelfde iterator die je in beide richtingen kan itereren.
Snap je reply niet

Emerxill

Legacy Member
badboyss zei:
Ivb de arraylist ik werk met een gewone array waarbij ik het aantal kamer meegeef als parameter zo kan ik indien er meerdere kamers per verdiep bijkomen enkel de parameter veranderen.
Maar de grootste reden voor een vaste index is dat als bv een klant uitboekt verdwijnt de klant uit de array.
Dus als ik kamer 1 klant a /2 kl b / 3 kl c /4 kl d heb en ik boek klb uit blijven de andere klanten op hun plaats zitten
Maar met een arraylist zullen de klant die in de kamer erachter zitten veranderd van nummer naar ik vermoed met een arraylist(correct me if i'm wrong)
Weet wel dat we nog maar halfwege zitten en nu nog maar de try catch en finaly van head first gezien hebben maar we slaan er ons wel door.
Je hebt toch een Array van Kamers, dus als je je klant daar uit boekt dan blijft de Kamer toch gewoon op zijn plaats.
Nadeel van een Array is dat als je een Kamer wil toevoegen je je Array helemaal opnieuw zal moeten initialiseren. Bij een ArrayList voeg je gewoon de nodige kamers toe.

Ik zou de index loskoppelen van het kamernummer. Op die manier wordt je code leesbaarder en flexibeler en maakt het uiteindelijk niet uit waar je kamer in de Array staat. Daarnaast kan je achteraf nog flexibel veranderen naar een of andere Collection (bv. (Array)List)

Tenslotte kan zou ik je ook aanraden om in je klanten informatie in een klasse te steken ("Klant"). Of indien je dat al gedaan hebt, het object Klant veel eerder aanmaken en die gebruiken ipv al die losse parameters door te geven in je methodes.

Dan doe je iets in de trend van:

Code:
public class Klant {
    private Long id;
    private String naam;
    private String voornaam;
    ...
    
    //Constructor indien nodig
    
    //Getters & Setters  
}

public class Kamer {
    private Long id; //aka kamernummer :)
    private boolean bezet; //hoewel overbodig --> indien een klant in de kamer zit dan is deze bezet
    private Klant klant;
    ....
    
    //Vervang het veld "bezet" door deze method:
    public boolean isBezet() {
        if (klant == null) {
            return false;
        }
        return true;
    }
}

Vervolgens kan je de klasse die verantwoordelijk is voor het boeken van de kamer iets doen als:
Code:
    public Kamer getEersteVrijeKamer() {
        for (Kamer kamer : kamers) { 
            if (!kamer.isBezet()) {
                return kamer;
            }
        }
        return null;
    }
    
    public Kamer getKamer(Long id) {
        for (Kamer kamer : kamers) {
            if (kamer.getId() == id) {
                return kamer;
            }
        }
        return null;
    }
    
    public void setKamerBezet(Kamer kamer, Klant klant) {
        kamer.setKlant(klant);
    }
    
    public Klant maakKlant(String voornaam, String naam,
            String straat, int huisnummer, String gemeente) {
        
        Klant klant = new Klant();
        klant.setVoornaam(voornaam);
        klant.setNaam(naam);
        klant.setStraat(straat);
        ...
    }

Als laatste tip: best kun je in het Engels programmeren ;)

badboyss

Legacy Member
thx

ik ben nu bezig met al mijn classes te herschrijven aangaande jullie tips.
als ik er ben zal ik waarschijnlijk nog wat vragen hebben maar deze. zul je dan hier wel horen :-)

alvast bedankt voor de info/tips

Nepherte

Legacy Member
Ik zou Kamer helemaal loskoppelen van Klant, en een nieuwe klasse Boeking introduceren die bijhoudt welke klant welke kamer heeft geboekt en in welke periode.

badboyss

Legacy Member
hallo

ik heb nu alles een beetje toegepast maar waarschijnlijk mezelf in de knoei gewerkt.
Ik heb wel nog de back-up dus op zich geen probleem,maar ik heb nu overal aparte classes gemaakt maar hoe krijg ik het object van klant en kamertype (classe vragengegevens) in mijn array kamers(verdiep setKlantInKamer)
Mensen die geintreseeerd zijn in de source

9lives

Let wel dat ik geen doorgewinterde programmeur ben dus alles zal wrschl veel beter kunnen,maar ik moet het wel kunnen verdedigen dus moest mijn syntax enigzins redelijk zijn gelieve daar op verder te gaan en enkel te kijken hoe ik de gegevens kan toevoegen

indien gewenst gelieve via mail te reageren,anders wordt het hier denk ik te onoverzichtelijk
ps engels wordt mss nog toegepast maar ik zou het eerst in het nederlands willen laten werken.

grts b

blackrabbit

Legacy Member
Denk hier eens over na/zoek hier wat over op:
Map<Customer, Room>
Map<Room, Customer>

Ik zie het voordeel van arrays binnen uw context niet.

profound

Legacy Member
Nepherte zei:
Ik zou Kamer helemaal loskoppelen van Klant, en een nieuwe klasse Boeking introduceren die bijhoudt welke klant welke kamer heeft geboekt en in welke periode.

Inderdaad, zou ik ook doen.

badboyss

Legacy Member
@blackrabbit map hebben we nog niet gezien,we mogen enkel dingen gebruiken die we al gezien hebben.
De array is gewoon om een x aantal kamers te maken per verdiep en daar de klant en kamer gegevens in bij te houden.
Het kan natuurlijk zoals ik hier al gelezen heb op vele verschillende manieren,maar voor het moment zitten we juist halfwege head first dus echt nog de basic.

Nu zijn klant en kamer van elkaar losgekoppeld en een classe reservering waarbij alles word bijgehouden.
Het probleem is dat ik die 2 nu samen in een array moet krijgen

grts b,

blackrabbit

Legacy Member
Hebben ze je uitgelegd hoe UML werkt?
Of kan je op de 1 of andere manier je design grafisch voorstellen?

Kan jezelf ook helpen om rare constructies/redeneringsfouten te vinden.




Om je vraag te beantwoorden (denk ik): een resevering koppelt een kamer aan een klant, right? (+ datum van reservering)
Is het dan niet gewoon een kwestie van Reservation in je array op te nemen?

Ik begrijp je uitleg niet helemaal, en ik vermoed dat het aan design-issues ligt...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan