Kleine Frage zu OOP

Ist Punkt 1. mit -> int pos = Arrays.asList(bewohner).lastIndexOf(null); korrekt?
Kommt darauf an, was bewohner ist. In dem Code
Java:
public boolean anmelden(Familie[] bewohner) {
        int pos = Arrays.asList(bewohner).lastIndexOf(null);
ist es auf jeden Fall falsch.

Abgesehen davon kann ich mir nicht vorstellen, dass Du plötzlich Methoden verwenden darfst, die auf Listen operieren, wenn Arrays verlangt sind - aber das musst Du wissen bzw. in Erfahrung bringen.
 
Java:
        private Familie[] bewohner;


	public boolean abmelden(Familie[] someFam) {
	if(someFam==bewohner) {
		someFam = null;
		return true;
	}else {
		return false;
	}
		
	}
Aufgabenstellung:
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
	 * Falls das Familien-Objekt im Bewohner-Array vorhanden ist, 
	 * wird deren Wohneinheit als frei markiert und true zurückgegeben,
	 * ansonsten wird false zurückgegeben
Ist das richtig ?
 
Wie wärst du denn vorgegangen als Anfänger, wenn du nicht wüsstest wie du eine Familie einer freien Stelle im Array hinzufügen kannst.
 
Ich hätte mir einen Zettel und einen Stift geschnappt, mir die Situation (das Array) aufgemalt und dann geschaut, wie ich in kleinen Schritten zu einer freien Stelle komme.
 
Okay, ja so werde ich es jetzt auch machen bis zum Erbrechen 🙂. Kannst du mir bitte eventuell sagen ob #52 korrekt ist?
 
Ich sags mal so: wenn sich jemand #52 ansieht, dann weiß er, dass das Grundlagenwissen des Autors von #52 gegen Null geht. Der Code ist äquivalent zu:
Java:
    public boolean abmelden(Familie[] someFam) {
        return someFam==bewohner;
    }
Abgesehen davon, passt die Methodensignatur nicht zur Aufgabe: "erhält eine Familie"
 
Java:
public boolean abmelden(Familie[] bewohner,Familie someFam, Familie zahl) {
  if (bewohner[someFam]) {
   bewohner[anzahlWohneinheiten--] = zahl;
   return true;
  } else {
   return false;
  }
 }

Meine Frage: Ich soll ja überprüfen ob eine Familie in "bewohner" enthalten ist. Die anzahlWohneinheiten soll ja um eins vermindert werden wenn "someFam" abgemeldet wird da die Länge der Bewohnerliste der Länge "anzahlWohneinheiten" entspricht. Da anzahlWohneinheiten aber ein Integer ist und someFam vom Typ Familie lässt sich das so vereinbaren? Kann mir einer helfen, in dem ich an dem Code nicht viel ändern muss?
 
Java:
 Implementieren Sie die Methode "anmelden" bzw. "abmelden",      * die ein Familien-Objekt als bewohner hinzufügt bzw. entfernt.      *      * Die public-Methode "anmelden" erhält eine Familie und gibt ein boolean zurück.      * Die Familie wird an eine freie Stelle im Array hinzugefügt.      * Eine Wohneinheit ist frei, wenn das Element im Array der Bewohner "null" ist.      * Ein Familien-Objekt darf nicht mehrfach im Bewohner-Array auftauchen.      * Sobald die Familie erfolgreich hinzugefügt wurde, gibt die Methode true zurück,      * ansonsten false;      *      * Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.      * Falls das Familien-Objekt im Bewohner-Array vorhanden ist,      * wird deren Wohneinheit als frei markiert und true zurückgegeben,      * ansonsten wird false zurückgegeben      *
 
Habe den Text gerade nochmal richtig formatiert eingefügt keine Ahnung warum es nicht geklappt hat , ist für mich auf jeden fall nicht sichtbar
Java:
 
Java:
  Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.     
 Falls das Familien-Objekt im Bewohner-Array vorhanden ist, wird deren Wohneinheit als frei markiert und true zurückgegeben,      ansonsten wird false zurückgegeben.
 
Aber wenn ich dir das so anschaue ist das eigentlich schon richtig , was ist denn daran falsch es so zu machen abgesehen davon dass someFam nicht in dem Array stehen kann
 
Kannst du mir einen Tipp geben , mit Stift und Papier kommt man zwar weiter, aber hilft mir wirklich nicht weiter, was den Code angeht.
 
Java:
    public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
Das funktioniert aber und ist korrekt ?
 
Kannst du mir einen Tipp geben

Du hast eine Methode der als Parameter eine Familie übergeben wird. Du sollst prüfen, ob diese Familie in der Instanzvariablen "bewohner" enthalten ist. Bei "bewohner" handelt es sich um ein Array.

Code:
Für jedes Element in bewohner {
    wenn, someFam dem aktuellen Element entspricht {
        markiere das aktuelle Element als frei;
        beende mit true;
    }
}
beende mit false;
 
Ja habe drüber nachgedacht und bin darauf gekommen. Und das müsste stimmten, ich frage nur ob es richtig ist, um zu wissen ob es noch etwas gibt was ich nicht als Anfänger bedacht habe. Aber ich bin der Meinung, dass die Methode so jetzt korrekt ist..
 
Java:
1) testFamilie(PublicTests)
java.lang.NullPointerException
    at Haus.<init>(Haus.java:39)
    at PublicTests.testFamilie(PublicTests.java:79)

Es ist alles richtig bis auf diese oben genannte Fehlermeldung, wie kann ich diese beheben ?

Java:
public class Haus {


    private String adresse;
    private int anzahlWohneinheiten;
    private Person besitzer;
    private Familie[] bewohner;
    
    public String getAdresse() {
        return adresse;
    }
    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }
    public int getAnzahlWohneinheiten() {
        return anzahlWohneinheiten;
    }
    public void setAnzahlWohneinheiten(int anzahlWohneinheiten) {
        this.anzahlWohneinheiten = anzahlWohneinheiten;
    }
    public Person getBesitzer() {
        return besitzer;
    }
    public void setBesitzer(Person besitzer) {
        this.besitzer = besitzer;
    }
    public Familie[] getBewohner() {
        return bewohner;
    }
    public void setBewohner(Familie[] bewohner) {
        this.bewohner = bewohner;
    }
    
    Haus(String adresse,  Person besitzer, int anzahlWohneinheiten){
        this.adresse=adresse;
        this.besitzer=besitzer;
        
        anzahlWohneinheiten = bewohner.length;
        this.bewohner = new Familie[anzahlWohneinheiten];
        
        if(anzahlWohneinheiten<1) {
            anzahlWohneinheiten=1;
        }
        
        
        
    }
    public boolean anmelden(Familie someFam) {
        bewohner[anzahlWohneinheiten++] = someFam;
        
        for (int i = 0; i < bewohner.length-1; ++i)
              for (int j = i+1; j < bewohner.length; ++j)
                if (bewohner[i] == bewohner[j]) {
                    return false;
                }
        return true;
    }
    public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
        
    }

    
    
    
    
    
}
 
Java:
  public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
            
            
            return true;
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
Falls das Familien-Objekt im Bewohner-Array nicht vorhanden ist, wird false zurückgegeben
ansonsten wird deren Wohneinheit als frei markiert und true zurückgegeben.
 
Java:
  public boolean abmelden(Familie someFam) {
            bewohner[anzahlWohneinheiten--] = someFam;
            for(int i = 0;i<bewohner.length;i++) {
                if(bewohner[i]!=someFam) {
                    return false;
                }
            }
           
           
            return true;
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
Falls das Familien-Objekt im Bewohner-Array nicht vorhanden ist, wird false zurückgegeben
ansonsten wird deren Wohneinheit als frei markiert und true zurückgegeben.

Also irgendwie schaffst Du es, mich immer wieder sprachlos zu machen....

Bitte beschreibe doch einmal, was der Code genau machen soll. Wenn die Familie someFam abgemeldet werden soll, dann gehst Du im Ordner mit den Anmeldungen zu einem Objekt, und auf der letzten Seite löscht Du, wer da steht um die Famile, die Du abmelden willst, drauf zu schreiben.

Dann gehst Du den Ordner von Anfang an durch, Wenn dann auf einer Seite nicht die Familie steht, dann bist Du fertig: Familie war nicht da ... (Also wenn auf der ersten Seite jemand anderes steht, dann bist du fertig, und gibst false zurück.)
Und solltest Du durch alle Seiten durch gekommen sein und die Familie nicht gefunden haben, dann gibst Du true zurück (Das kann zum Glück nicht passieren - dafür hast Du die Familie ja schon rein gepackt....)

Sollte die Familie in der Liste gewesen sein dann steht sie evtl. dann doppelt in der Liste?

Und dann noch der Hinweis: Instanzen vergleicht man nicht mit == oder != sondern mit equals. Mag bei Dir noch egal sein, da Du ja nur so generierst und die Instanzen im Speicher hälst, aber das muss ja nicht immer so sein. Sollte schon von den Strings bekannt sein, dass das nicht wirklich gut ist.
 
Die public-Methode "abmelden" erhält eine Familie und gibt ein boolean zurück.
Falls das Familien-Objekt im Bewohner-Array nicht vorhanden ist, wird false zurückgegeben
ansonsten wird deren Wohneinheit als frei markiert und true zurückgegeben.

Das ist ungefähr der Text der Aufgabe. Ich möchte die Erklärung zu deinem Code. Was soll z.B. bewohner[anzahlWohneinheiten--] = someFam; deiner Meinung nach bewirken?
 
Es soll ja eine Familie abgemeldet werden, also müsste "=someFam" nach "bewohner[anzahlWohneinheiten--]" entfernt werden und um den Fall zu vermeiden dass die Familie someFam doppelt vorkommt könnte man mit einer äußeren for Schleife lösen in dem man Index 0 und Index 1 und 1 und 2 miteinander vergleicht undso weiter
 
Ja das bewirkt erstmal nichts sinnvolles mit just no body schon sagt es soll somefam entfernt werden sobald someFam in bewohner enthalten ist, ich überlege mal kurz.
 
Man könnte noch eine if Bedingung mit for Schleife erstellen, wenn bewohner =someFam dann soll Anzahl Wohneinheiten um eine Einheit verringert werden
 
Die Anzahl der Wohneinheiten ist ja äquivalent zu der Anzahl der Familien die man ins bewohner array packen könnte. Also wird eine Familie somit abgemeldet.
 
Lieber @jono , alles was du bisher zeigst, deutet sehr sehr deutlich darauf hin, dass dir wichtige Grundlagen fehlen. Ich weiß nicht, ob du das für Schule oder Studium oder für dich privat machst, aber ohne Grundlagen wird es enorm schwierig für dich. So wie jetzt weiter zu arbeiten hat keinen Zweck. Das wird nur deprimierend für dich werden und Programmieren sollte Spaß machen.

Wenn du kannst, dann geh noch mal einige Schritte zurück und befasse dich zunächst mit einfacheren Dingen, bis diese sitzen. Dann löse diese Aufgabe.
 
Anstatt weiterzuhelfen einfach hängen lassen oder einfach mal diese Kleinigkeit vorzusagen wäre echt kein Akt, das merke ich mir und lerne auch daraus so ist es nicht aber sich so zu äußern wie ihr bringt mich auch null weiter, außerdem ist das eine kleinigkeit an der ich hänge die ich einfach nicht im stande bin zu beheben, weil ich das noch NIE gemacht habe. Der Rest ist schon alles korrekt außer das mit der Methode.
 
Die Bewohner-Arraylänge wird dadurch nur verkürzt

Ein Array kann man nicht verkürzen. Es hat immer die Länge wie man es erstellt hat. Die einzige Möglichkeit die Länge eines Arrays zu verändern ist, ein neues längeres/kürzeres Array zu erzeugen und den Inhalt des alten Arrays in das neue Array zu kopieren.
 
Anstatt weiterzuhelfen einfach hängen lassen

Du hast eine Methode der als Parameter eine Familie übergeben wird. Du sollst prüfen, ob diese Familie in der Instanzvariablen "bewohner" enthalten ist. Bei "bewohner" handelt es sich um ein Array.

Code:
Für jedes Element in bewohner {
    wenn, someFam dem aktuellen Element entspricht {
        markiere das aktuelle Element als frei;
        beende mit true;
    }
}
beende mit false;

Java:
public boolean abmelden(Familie someFam) {
    for(int i = 0; i < bewohner.length; i++) {
        if(bewohner[i].equals(someFam)) { // damit das wirklich richtig funktioniert muss noch equals() von Familie überschrieben werden
            bewohner[i] = null; // Wohneinheit als frei markieren
            return true;
        }
    }
    return false;
}
 
Zuletzt bearbeitet:
Anstatt weiterzuhelfen einfach hängen lassen oder einfach mal diese Kleinigkeit vorzusagen wäre echt kein Akt, das merke ich mir und lerne auch daraus so ist es nicht aber sich so zu äußern wie ihr bringt mich auch null weiter, außerdem ist das eine kleinigkeit an der ich hänge die ich einfach nicht im stande bin zu beheben, weil ich das noch NIE gemacht habe. Der Rest ist schon alles korrekt außer das mit der Methode.

Also ich finde es interessant, wie du das jetzt darstellst. Seit Donnerstag sind mehrere Leute aktiv dabei, Dir Dinge zu erläutern, aber irgendwie sehe ich nicht wirklich einen Lernerfolg. Das mögen andere anders sehen, aber ich sehe das sehr kritisch.

Was man uns vorwerfen könnte, wäre maximal, dass von uns nicht erst vom Code weggegangen wurde damit Du Dir erst einmal einen Pseudo Code überlegst, wie sowas gehen könnte...

Generell bedeutet Studium, dass man sich selbst Dinge aktiv beibringen muss. Wenn einem irgendwo Grundlagen fehlen, muss man diese eigenständig aufarbeiten.

Aber mal ein paar allgemeine Anregungen:
a) Wenn Du eine Aufgabe lösen sollst, dann überlege Dir erst einmal mit Papier und Stift, was vorher vorliegt, was als Ergebnis gewünscht wird und wie man vom einen Zustand in den anderen kommt. Vergiss dabei Java! Werde Dir erst einmal klar darüber, was für Daten wie vorliegen und was genau gewünscht wird!
b) Schreibe einfachen Code. Anfänger, die tatsächlich meinen, sowas schreiben zu müssen bewohner[anzahlWohneinheiten--] sind in meinen Augen etwas dämlich. Sorry wenn ich das so direkt sage, aber Anfänger sollten Code immer so schreiben, dass sie eine Chance haben, ihn zu verstehen. Und dazu gehören so ganz triviale Regeln wie ein Befehl pro Zeile.

Und nein: Ich glaube nicht, dass das alles ganz neue Dinge sind. Nach meiner Erfahrung gab es zu dieser Thematik bestimmt Vorlesungen und Übungen. Es gibt Professoren und Dozenten - Gerüchte besagen, dass diese Damen und Herren sich nicht von Fragen stellenden Studenten ernähren. Fragen zu stellen ist also nicht wirklich eine Tätigkeit, die als Suizid Versuch einzuordnen ist. Ich habe also nicht wirklich ein schlechtes Gewissen, wenn Du ggf. diese Abgabe nicht schaffst und dann den Stoff noch einmal in Ruhe aufarbeiten kannst um dann nächstes Jahr zu bestehen....
 

Neue Themen


Zurück
Oben