# Delete Methode



## Ostkreuz (12. Dez 2022)

Kann mir jemand helfen hierfür einen Ansatz zu finden? Ich habe keine Ahnung wie ich hier beginnen soll 

Schreiben Sie eine Methode _public void deletePirate*(*String firstName*, *String lastName*), *_die mit Vorname und Nachname eines Piraten aufgerufen wird und den Piraten aus der Mannschaft löscht. Erweitern Sie die main-Methode so, dass einer der Piraten aus der Mannschaft gelöscht wird.

Das hier ist der Constructor für die Piraten Klasse


```
public Pirate(String firstName, String lastName, int yearOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.yearOfBirth = yearOfBirth;
```


----------



## yfons123 (12. Dez 2022)

worin hast du denn die piraten gespeichert 

was helfen dir die parameter firstname und lastname? => hierüber kannst du entscheiden welcher pirat gelöscht werden soll

also, du weist wie du den richtigen findest , du weist wo du den piraten abgespeichert hast.
jetzt kommts noch drauf an wie du den piraten aus dem speicherort raus kriegst

in java löscht man nicht selber sachen, sondern man entfernt alle referenzen auf ein objekt und dann wird das objekt irgendwann vom garbage collector gelöscht. dh du musst die referenz weg kriegen mit entweder überspeichern oder auf null ( hier der fall ) setzen

damit kannst du den piraten löschen


----------



## White_Fox (12. Dez 2022)

Ostkreuz hat gesagt.:


> Mannschaft


Ich nehme mal an, daß du irgendwo eine Klasse 'Crew' oder so hast. Irgenwo darin müßten die einzelnen Mitglieder gehalten sein, und da willst du einen bestimmten Piraten nach Namen auswählen und entfernen.


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> worin hast du denn die piraten gespeichert
> 
> was helfen dir die parameter firstname und lastname? => hierüber kannst du entscheiden welcher pirat gelöscht werden soll
> 
> ...


Die Piraten sind im Array crew gespeichert, aber da sie von der Klasse Piraten sind weiß ich nicht wie ich die Werte vergleichen soll, da immer der Fehler kommt

Ship.java:83: error: incomparable types: Pirate and String            if (crew _ == firstName) {_


----------



## yfons123 (12. Dez 2022)

naja ein array ist ein haufen von sachen, du hast im code festgelegt dass das ein piraten haufen ist

wie greift man auf ein array zu?
das macht man zb so


> crew[0]


damit krieg ich den pirat der an der ersten stelle im array haufen ist

von diesem willst du jetzt den firstname, dh du willst sein attribut haben und das geht so


```
Pirate pirat = crew[0]
if(pirat.firstName == "Bob")
{
    crew[0] = null
}
```

string vergleiche funktionieren so aber nicht wirklich ,diese muss man mit .equals vergleichen ( das kann dir jemand anderes erklären )

```
Pirate pirat = crew[0]
if(pirat.firstName.equals("Bob") && pirat.lastName.equals("der Baumeister"))
{
    crew[0] = null
}
```
also wenn der pirat an der ersten stelle bob der baumeister ist dann wird der gelöscht


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> naja ein array ist ein haufen von sachen, du hast im code festgelegt dass das ein piraten haufen ist
> 
> wie greift man auf ein array zu?
> das macht man zb so
> ...


Weiß nicht ob mein Ansatz jetzt richtig ist, aber bekomme jetzt entweder die Fehlermeldung, dass ich keinen Zugriff auf die Klasse Pirat habe oder dass das Symbol nicht gefunden werden kann. Für die Aufgabe soll die ganze Liste der Crew, also 10 Piraten durchlaufen werden

```
public void deletePirate(String firstName, String lastName) {
        int count = 0;
        Pirate pirat = crew[count];
        for (int i =0; i<this.crew.length; i++)
            if(pirat.firstName.equals("firstName") && pirat.lastName.equals ("lastName")){
                crew [count] = null;
            }
            else {
                count++;
            }
}
```


----------



## yfons123 (12. Dez 2022)

Ostkreuz hat gesagt.:


> Weiß nicht ob mein Ansatz jetzt richtig ist, aber bekomme jetzt entweder die Fehlermeldung, dass ich keinen Zugriff auf die Klasse Pirat habe oder dass das Symbol nicht gefunden werden kann. Für die Aufgabe soll die ganze Liste der Crew, also 10 Piraten durchlaufen werden
> 
> ```
> public void deletePirate(String firstName, String lastName) {
> ...


der ansatz ist der richtige, aber warum hast du den counter? bringt der dir was?

was passiert wenn du i hernimmst?
der pirat ist immer der pirat an der stelle 0 da er vor der schleife gesetzt wird, du wolltest doch über alle piraten drüber latschen oder nicht
hier latscht du 10 mal über den gleichen drüber.. die arme seele 

zu deinem "sichtbarkeits problem" dh deine main klasse kann die klasse Pirat nicht sehen, vllt fehlt ein "public" vor deinem piraten? oder wie ist dein projekt aufgebaut


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> der ansatz ist der richtige, aber warum hast du den counter? bringt der dir was?
> 
> was passiert wenn du i hernimmst?
> der pirat ist immer der pirat an der stelle 0 da er vor der schleife gesetzt wird, du wolltest doch über alle piraten drüber latschen oder nicht
> ...


Die Attribute der Piratenklasse müssen privat sein


----------



## yfons123 (12. Dez 2022)

Ostkreuz hat gesagt.:


> Die Attribute der Piratenklasse müssen privat sein


dann schreib einen getter um sie raus zu bekommen wie zb


```
public string getFirstName(){
    return this.firstName;
}
```
und schon kommst du ran an die werte


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> dann schreib einen getter um sie raus zu bekommen wie zb
> 
> 
> ```
> ...


Hab es jetzt soweit, aber irgendwie ist es immernoch nicht richtig, wo ist jetzt mein Fehler?


----------



## yfons123 (12. Dez 2022)

yfons123 hat gesagt.:


> der pirat ist immer der pirat an der stelle 0 da er vor der schleife gesetzt wird, du wolltest doch über alle piraten drüber latschen oder nicht
> hier latscht du 10 mal über den gleichen drüber.. die arme seele


das ist dein fehler


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> das ist dein fehler


Aber kann ja i nicht vor der initialisierung einsetzen also wie soll ich das ohne counter beheben?


----------



## yfons123 (12. Dez 2022)

dann verschieb halt die piraten zeile rein in die for schleife vllt siehst du es dann


----------



## White_Fox (12. Dez 2022)

Muß es eigentlich ein Array sein, warum keine ArrayList? Das würde dir einiges vereinfachen.


----------



## yfons123 (12. Dez 2022)

White_Fox hat gesagt.:


> Muß es eigentlich ein Array sein, warum keine ArrayList? Das würde dir einiges vereinfachen.


erste vorlesung: java streams LETS GOOOOO


----------



## Ostkreuz (12. Dez 2022)

White_Fox hat gesagt.:


> Muß es eigentlich ein Array sein, warum keine ArrayList? Das würde dir einiges vereinfachen.


In der Aufgabenstellung steht Array


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> dann verschieb halt die piraten zeile rein in die for schleife vllt siehst du es dann


da steht dann variable declaration not allowed here


----------



## yfons123 (12. Dez 2022)

poste mal den code hier ( nicht als bild.. ) ... ich meinte du solltest den pirat in die geschweiften klammern wo hinpacken wo es sinn machen könnte


----------



## Ostkreuz (12. Dez 2022)

yfons123 hat gesagt.:


> poste mal den code hier ( nicht als bild.. ) ... ich meinte du solltest den pirat in die geschweiften klammern wo hinpacken wo es sinn machen könnte


Ist jetzt alles aus der Aufgabe der Schiff Klasse


```
public class Ship {
    private String shipName;
    private int treasury = 0;
    private Pirate captain;
    private Pirate quartermaster;
    private Pirate [] crew = new Pirate [10];

    /**
     * @return die Mitglieder der Crew.
     */
    public Pirate[] getCrew() {
        return crew;
    }
    /**
     * Ruft den Namen des Schiffs ab.
     * @param shipName der Name des Schiffs.
     */
    public Ship(String shipName) {
        this.shipName = shipName;
    }

    /**
     * @return
     */
    public String getShipName () {
        return shipName;
    }

    /**
     * @return die Anzahl der Dukaten.
     */
    public int getTreasury () {
        return treasury;
    }

    /**
     * @param captain
     */
    public void setCaptain (Pirate captain) {
        this.captain = captain;
    }
    /**
     * @return
     */
    public Pirate getCaptain () {
        return captain;
    }
    /**
     * @param quartermaster
     */
    public void setQuartermaster (Pirate quartermaster) {
        this.quartermaster = quartermaster;
    }
    /**
     * @return
     */
    public Pirate getQuartermaster () {
        return quartermaster;
    }
    /**
     * @param crew
     * @return
     */
    public Pirate [] getCrew (Pirate [] crew) {
        return crew;
    }
    /**
     * @param p
     */
    public void addPirate(Pirate p) {
        for (int i =0; i<this.crew.length; i++)
            if(crew[i] == null) {
                crew [i] = p;
                break;
            }

    }
    /**
     * @param firstName
     * @param lastName
     */

    public void deletePirate(String firstName, String lastName) {

        for (int i =0; i<this.crew.length; i++)
        Pirate pirate = crew[i]
            if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals(lastName)){
                crew [count] = null;
            }
            else {
                count++;
            }
}

    /**
     * Gibt die Attribute des Schiffs und die Namen der Crew aus.
     */
    public void print () {
        System.out.println("Das Schiff " + shipName + "besitzt " + treasury +  "Dukaten " + "und den Kapitän " + captain + ", sowie den Quartiermeister " + quartermaster + "und den Rest der crew " + crew + ".");
    }
```


----------



## yfons123 (12. Dez 2022)

```
for (int i =0; i<this.crew.length; i++)
        Pirate pirate = crew[i]
            if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals(lastName)){
                crew [count] = null;
            }
            else {
                count++;
            }
```
ist das eine valide for schleife? dachte die haben eine klammer außen rum 

```
public void deletePirate(String firstName, String lastName) {
        for (int i =0; i<this.crew.length; i++) {
            Pirate pirate = crew[i];
            if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals(lastName)){
                crew [count] = null;
            }
            else {
                count++;
            }
        }
    }
```
eine einzeiler for schleife darfst du auch nicht so benutzen wie du es hast ( einzeiler for schleifen sind ohne klammern )


----------



## Neumi5694 (12. Dez 2022)

```
for (int i =0; i<this.crew.length; i++)
        Pirate pirate = crew[i]
            if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals(lastName)){
                crew [count] = null;
            }
            else {
                count++;
            }
```
Der Code kompiliert doch noch nicht mal, deine Schleife hat keine Klammer. Und die Zeile danach hat kein Semikolon ...
count ist hier vollkommen fehl am Platz. Außerdem heißt dein Pirat mal "pirat" und mal "pirate".

Probier's mal so

```
for (int i =0; i<this.crew.length; i++) {
        Pirate pirate = crew[i];
        if(pirate != null && pirate.getFirstName().equals(firstName) && pirate.getLastName().equals(lastName)){
            crew [i] = null;
            break;
        }
}
```


----------



## KonradN (12. Dez 2022)

a) Bitte gewöhne Dir an, immer mit { } zu arbeiten, wenn Du eine Schleife oder if Statement hast. Was ist in der for Schleife?
b) Arbeite mit einer Entwicklungsumgebung, die den Code formatieren kann. Nutze diese Funktion!
c) Nach einem Statement kommt in Java ein ; nd bei der Zuweisung fehlt das ...


----------



## yfons123 (12. Dez 2022)

KonradN hat gesagt.:


> b) Arbeite mit einer Entwicklungsumgebung, die den Code formatieren kann. Nutze diese Funktion!


ganz wichtiger hinweis... weist du was passiert wenn die IDE den code formatiert wenn die klammern nicht passen? richtig seine formatierung kommt raus

schon aufgefallen dass zeile 93 die schließende klammer der klasse ist? die IDE kann die klammern nicht richtig erkennen und dann kommt das raus meine güte


----------



## KonradN (12. Dez 2022)

Du sprichst in Rätzeln @yfons123. Was genau willst Du bitte sagen. Achte doch bitte etwas mehr auf eine verständliche Schreibweise.


----------



## yfons123 (12. Dez 2022)

```
package Test;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.Stream;

    public class Ship {
        private String shipName;
        private int treasury = 0;
        private Pirate captain;
        private Pirate quartermaster;
        private Pirate [] crew = new Pirate [10];

        /**
         * @return die Mitglieder der Crew.
         */
        public Pirate[] getCrew() {
            return crew;
        }
        /**
         * Ruft den Namen des Schiffs ab.
         * @param shipName der Name des Schiffs.
         */
        public Ship(String shipName) {
            this.shipName = shipName;
        }

        /**
         * @return
         */
        public String getShipName () {
            return shipName;
        }

        /**
         * @return die Anzahl der Dukaten.
         */
        public int getTreasury () {
            return treasury;
        }

        /**
         * @param captain
         */
        public void setCaptain (Pirate captain) {
            this.captain = captain;
        }
        /**
         * @return
         */
        public Pirate getCaptain () {
            return captain;
        }
        /**
         * @param quartermaster
         */
        public void setQuartermaster (Pirate quartermaster) {
            this.quartermaster = quartermaster;
        }
        /**
         * @return
         */
        public Pirate getQuartermaster () {
            return quartermaster;
        }
        /**
         * @param crew
         * @return
         */
        public Pirate [] getCrew (Pirate [] crew) {
            return crew;
        }
        /**
         * @param p
         */
        public void addPirate(Pirate p) {
            for (int i =0; i<this.crew.length; i++) {
                if(crew[i] == null) {
                    crew [i] = p;
                    break;
                }
            }
        }
        /**
         * @param firstName
         * @param lastName
         */

        public void deletePirate(String firstName, String lastName) {

            for (int i =0; i<this.crew.length; i++) {
                Pirate pirat = crew[i];
                if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals(lastName)){
                    crew [i] = null;
                }
                else {
                }
            }
        }

        /**
         * Gibt die Attribute des Schiffs und die Namen der Crew aus.
         */
        public void print () {
            System.out.println("Das Schiff " + shipName + "besitzt " + treasury +  "Dukaten " + "und den Kapitän " + captain + ", sowie den Quartiermeister " + quartermaster + "und den Rest der crew " + crew + ".");
        }
    }
```
so ist die klammern setzung richtig, du hast drüber nochmal eine klammer vergessen


----------



## Ostkreuz (12. Dez 2022)

Der Code sieht jetzt so aus, aber es kommt immer noch die Fehlermeldung: ShipTest.test3_deletePirate_deletesGivenPirateByName_1P ... failed -> 0 Points because null 


```
public class Ship {
    private String shipName;
    private int treasury = 0;
    private Pirate captain;
    private Pirate quartermaster;
    private Pirate [] crew = new Pirate [10];

    /**
     * @return die Mitglieder der Crew.
     */
    public Pirate[] getCrew() {
        return crew;
    }
    /**
     * Ruft den Namen des Schiffs ab.
     * @param shipName der Name des Schiffs.
     */
    public Ship(String shipName) {
        this.shipName = shipName;
    }

    /**
     * @return
     */
    public String getShipName () {
        return shipName;
    }

    /**
     * @return
     */
    public int getTreasury () {
        return treasury;
    }

    /**
     * @param captain
     */
    public void setCaptain (Pirate captain) {
        this.captain = captain;
    }
    /**
     * @return
     */
    public Pirate getCaptain () {
        return captain;
    }
    /**
     * @param quartermaster
     */
    public void setQuartermaster (Pirate quartermaster) {
        this.quartermaster = quartermaster;
    }
    /**
     * @return
     */
    public Pirate getQuartermaster () {
        return quartermaster;
    }
    /**
     * @param crew
     * @return
     */
    public Pirate [] getCrew (Pirate [] crew) {
        return crew;
    }
    
    public void addPirate(Pirate p) {
        for (int i =0; i<this.crew.length; i++)
            if(crew[i] == null) {
                crew [i] = p;
                break;
            }
    }   
    
    /**
     * @param firstName
     * @param lastName
     */
    public void deletePirate(String firstName, String lastName) {
        for (int i =0; i<this.crew.length; i++) {
            Pirate pirat = crew[i];
            if(pirat.getFirstName().equals(firstName) && pirat.getLastName().equals (lastName)){
                crew [i] = null;
            }

        }
    }
    /**
     * Gibt die Attribute des Schiffs und die Namen der Crew aus.
     */
    public void print () {
        System.out.println("Das Schiff " + shipName + "besitzt " + treasury +  "Dukaten " + "und den Kapitän " + captain + ", sowie den Quartiermeister " + quartermaster + "und den Rest der crew " + crew + ".");
    }
```


----------



## yfons123 (12. Dez 2022)

welchen namen hat denn ein pirat wenn er null ist? gar keinen , es ist ja nicht mal ein pirat

das musst du abprüfen


----------



## White_Fox (12. Dez 2022)

yfons123 hat gesagt.:


> erste vorlesung: java streams LETS GOOOOO


Wieso Streams? Eine for-each-Schleife reicht da schon, so viel schwerer ist der eine Doppelpunkt nicht.

Dafür muß er dann nicht umständlich auf null prüfen, die Größe nicht anpassen, und die remove()-Methode der ArrayList macht den Code auch besser verständlich.


----------



## temi (13. Dez 2022)

White_Fox hat gesagt.:


> Wieso Streams? Eine for-each-Schleife reicht da schon, so viel schwerer ist der eine Doppelpunkt nicht.
> 
> Dafür muß er dann nicht umständlich auf null prüfen, die Größe nicht anpassen, und die remove()-Methode der ArrayList macht den Code auch besser verständlich.


Es ist sinnlos, das zu diskutieren, wenn die Vorgabe lautet: "Verwende ein Array...".

Das ist der übliche Weg. Man beginnt mit Arrays und lernt den Umgang damit und stellt irgendwann fest, dass es auch einfachere Methoden gibt, z. B. durch die Verwendung von Klassen, die einem die (bis dato selbst verrichtete Arbeit) abnehmen. Und es ist durchaus sinnvoll, die grundlegenden Datenstrukturen, und den Umgang damit, zu beherrschen, auch wenn sie in der späteren Praxis seltener verwendet werden. Außerdem hilft es dabei die magische Methode ArrayList*remove() mit weniger "Ehrfurcht" zu verwenden, wenn man sich, aufgrund seines erworbenen Wissens, bewusst ist, was "under the hood" in ähnlicher Art passiert.


----------



## White_Fox (13. Dez 2022)

Ist es denn Vorgabe? Nur weil in der Vorlesung noch nichts anderes dran war würde ich daraus jetzt längst noch keine Vorgabe ableiten, und hätte ich damals, als ich noch Vorlesungen hatte, auch nicht gemacht.

Aber nun gut...


----------



## temi (13. Dez 2022)

Ostkreuz hat gesagt.:


> In der Aufgabenstellung steht Array


----------



## Maliko (13. Dez 2022)

White_Fox hat gesagt.:


> Nur weil in der Vorlesung noch nichts anderes dran war würde ich daraus jetzt längst noch keine Vorgabe ableiten, und hätte ich damals, als ich noch Vorlesungen hatte, auch nicht gemacht.


Da kannst du von Glück reden, dass du nicht meinen Prof hattest. Der hat z.B. bei Hausarbeiten die als Prüfungsersatzleistung zählten alles was nicht 100%ig den Vorgaben der Aufgabenstellung entsprach als Falsch mit 0 Punkten gewertet. Manche Professoren sind da sehr sehr eigen.


----------

