OOP Array anlegen mit unterschiedlichen Werten

excuseme

Mitglied
Hallo, ich bins mal wieder. Ich habe wieder mal ein paar Probleme bei einer Aufgabe... Folgend mein Abbildung eines Hotelzimmers, da ist eigentlich alles ok, die Angaben sind denke ich erfüllt. Mal abgesehen von der Methode vermieten() funktioniert alles, da bin ich mir aber auch unsicher wie ich ein Zimmer belegen soll.
Java:
public class Hotelzimmer {
    int zimmernr;
    int betten;
    double preis;
    boolean belegt;
   
    public Hotelzimmer(int zimmernr, int betten, double preis) {
        if (zimmernr >= 1 && zimmernr <= 999 && betten >= 1 && betten <= 6 && preis >= 50.0 && preis <= 300.0) {
            this.zimmernr = zimmernr;
            this.betten = betten;
            this.preis = preis;
            belegt = false;
        }
    }
    public int getBetten() {
        return betten;
    }
    public void setBetten(int betten) {
        if (betten >= 1 && betten <= 6) {
            this.betten = betten;
        }
        else {
            return;
        }
    }
    public boolean istBelegt() {
        if (belegt) {
            return true; }
        else {
            return false;
        }
     }
    public void vermieten() {
        this.zimmernr = true;
    }
    public int getZimmerNr() {
        return zimmernr;
    }
    @Override
    public String toString() {
        return "Stock: " + "\nBettenanzahl: " + this.betten + "\nPreis+" + this.preis;
}
Hier kommt mein richtiges Problemchen, also ich habe ein Hotelzimmer und möchte 100 Komponenten deklarieren. Das ist meine erste for Schleife. Nun soll die Zimmernr dreistellig sein, die erste Stelle ist das Stockwerk und die zweite und dritte Stelle die Zimmernr.
In der zweiten Schleife deklariere ich also die max Anzahl der Stockwerke und in der folgenden dann für jedes Stockwerk a' 20 Zimmer, ohne Zimmer 13. Die Bettenanzahl und der Preis sind feste Werte.
Es sähe dann etwa so aus: 1 Stock: 101...121 (ohne 113) etc.

Java:
public class HotelZimmerTest {

    public static void main(String[] args) {
        int stockwerk = 6;
        int zimmer = 20;
        Hotelzimmer[] hotelneubau_ref = new Hotelzimmer[100];
        for (int i = 0; i < hotelneubau_ref.length; i++) { //100 neue Zimmer
            for(int k = 1; k < stockwerk; k++) //max 5 Stockwerke
                for(int j = 0; j < zimmer && j != 12; j++) //Zimmer durchnummeriert, ohne 13
            hotelneubau_ref[i] = new Hotelzimmer(k+j, 2, 100.0);
        }
        for (int i = 0; i < hotelneubau_ref.length; i++) { //ausgabe
            System.out.println(hotelneubau_ref[i]);
        }
    }
}
 
Die Ausgabe funktioniert nicht und die Schleifen um die Stockwerke und Zimmer hochzuzählen auch nicht. Und in der Klasse Hotelzimmer funktioniert die Methode vermieten() nicht
 
So verschachtelt man Schleifen nicht.

Deine Logik liest sich gerade wie:
Für jedes der 100 Zimmer, lege 5 Stockwerke an und dann werden nochmal für jeden Schleifendurchlauf (wir sind schon bei 500), 20 Zimmer angelegt. Wobei die Abbruchbedingung bei der letzten Schleife auch nicht passt. Bei j=12 brichst du immer ab, also werden nur 12 Zimmer erstellt.

Sowas kann man relativ leicht mit einer Schleife machen, die wirklich nur über die 100 Zimmer läuft.
Java:
        int anzahlBetten = 100;
        int anzahlStockwerke = 5;

        int q = anzahlBetten / anzahlStockwerke;

        for (int i = 0; i < anzahlBetten; i++) {
            System.out.println(String.format("Zimmer: %d%02d", (i / q) + 1, i % q < 13 ? (i % q) + 1 : (i % q) + 2));
        }
 
Und wenn Du die Zimmernummer nicht als String formatiert haben willst, sondern als Zahl brauchst, rechnest Du einfach stockwerk*100 + zimmernummer.
 
Oder mit Stream iterate und einem Filter, um eventuell mehrere unerwünschte Nummern auszuschliessen, trotzdem aber immer 20 Zimmer pro Stockwerk zu haben (hier mit String als Zimmernummer):
Java:
import static java.lang.String.format;
import static java.util.Arrays.binarySearch;
import static java.util.stream.IntStream.*;
import java.util.Arrays;
...
public static void main(String[] args) {
  int stockwerke = 6;
  int zimmerProStockwerk = 20;
  int[] verboteneNummern = { 4, 13, 17 };
  Hotelzimmer[] alleZimmer =
    rangeClosed(1, stockwerke).
    boxed().
    flatMap(s ->
      iterate(1, i -> i + 1).
      filter(i -> binarySearch(verboteneNummern, i) < 0).
      limit(zimmerProStockwerk).
      mapToObj(
          j -> new Hotelzimmer(
              format("%d%02d", s, j),
                    2, 100.0)))
   .toArray(Hotelzimmer[]::new);
  System.out.println(Arrays.toString(alleZimmer));
}
 
Oh je, ich habe schon öfters Lösungen mit '?', ':' und so gesehen, aber bisher habe ich das noch nicht wirklich verstanden. Auch so blicke ich da noch nicht ganz durch bei deiner Lösung :/ Kann man das vielleicht auch anders lösen? Weil auf so eine Lösung komme ich wohl nicht selber 😀
 
Oh je, ich habe schon öfters Lösungen mit '?', ':' und so gesehen, aber bisher habe ich das noch nicht wirklich verstanden. Auch so blicke ich da noch nicht ganz durch bei deiner Lösung :/ Kann man das vielleicht auch anders lösen? Weil auf so eine Lösung komme ich wohl nicht selber 😀
Java:
int zimmer = i % q < 13 ? (i % q) + 1 : (i % q) + 2;
ist äquivalent zu
Java:
int zimmer;
if (i % q < 13) {
    zimmer = (i % q) + 1;
} else {
    zimmer = (i % q) + 2;
}
 
Auch so blicke ich da noch nicht ganz durch bei deiner Lösung :/

Ich formulier den Code von @Tarrew mal ausführlich um:
Java:
        int anzahlBetten = 100;
        int anzahlStockwerke = 5;

        int bettenProStockwerk = anzahlBetten / anzahlStockwerke;

        for (int i = 0; i < anzahlBetten; i++) {
            int stockwerk = i / bettenProStockwerk; // hier zählen wir ab 0
            int zimmer = i - (stockwerk * bettenProStockwerk); 
            if (zimmer == 12) // Zimmernr. 13
                zimmer++;
            System.out.println(String.format("Zimmer: %d%02d", stockwerk + 1, zimmer+1);
            // zusatz:
            int zimmernr = (stockwerk + 1)*100 + (zimmer+1);
        }

Jetzt alles klar?
 

Neue Themen


Zurück
Oben