Delete Methode

Ostkreuz

Aktives Mitglied
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

Java:
    public Pirate(String firstName, String lastName, int yearOfBirth) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.yearOfBirth = yearOfBirth;
 
Y

yfons123

Gast
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
 

Ostkreuz

Aktives Mitglied
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
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) {
 
Y

yfons123

Gast
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
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

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

Aktives Mitglied
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

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

Java:
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 )
Code:
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
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
Java:
    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++;
            }
}
 

Anhänge

  • Screenshot_3.png
    Screenshot_3.png
    10,7 KB · Aufrufe: 0
Y

yfons123

Gast
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
Java:
    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++;
            }
}
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 :p

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

Aktives Mitglied
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 :p

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
Die Attribute der Piratenklasse müssen privat sein
 
Y

yfons123

Gast
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

Aktives Mitglied
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

Java:
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 + ".");
    }
 
Y

yfons123

Gast
Java:
        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 :p
Code:
    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

Top Contributor
Java:
 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
Java:
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;
        }
}
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
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 ...
 
Y

yfons123

Gast
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
 
Y

yfons123

Gast
Java:
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

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

Java:
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 + ".");
    }
 

temi

Top Contributor
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.
 
Zuletzt bearbeitet:

White_Fox

Top Contributor
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...
 

Maliko

Bekanntes Mitglied
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.
 

Neue Themen


Oben