Map - remove() ?

programmer77

Mitglied
Hallo,
Wie kann man kontrollieren, ob die entsprechende Aufgabe gelöscht oder nicht vorhanden ist?
Also output --> " No Entry" statt null (wenn nicht vorhanden) .
" Gelöscht " statt null (wenn gelöscht.)
class Period {

private Map<String, Period> zeitPlan = new TreeMap<String, Period>();
public String rem(String aufgabe) {
return null;
}
 
X

Xyz1

Gast
Machen wirs mit etwas Professionalität:
Java:
    public static class Period {

        private final Map<String, Period> zeitPlan = new TreeMap<>();

        public Period() {
            zeitPlan.put("hallo", this);
            zeitPlan.put("du", this);
            zeitPlan.put("da!", this);
        }

        public String rem1(String aufgabe) {
            if (rem2(aufgabe)) {
                return "Geloescht";
            } else {
                return "No Entry";
            }
        }

        private final boolean rem2(String aufgabe) {
            if (zeitPlan.containsKey(aufgabe)) {
                zeitPlan.remove(aufgabe);
                return true;
            } else {
                return false;
            }
        }        
    }
    
    public static void main(String[] args) {
        Period period = new Period();
        System.out.println(period.rem1("hallo"));
        System.out.println(period.rem1("hallo"));
    }
 

programmer77

Mitglied
Danke für die Antwort, aber ich habe bissl falsch erklärt.
Als Output brauche ich 3 Optionen.
1- task removed, 2- no entry , 3 - null
System.out.println(period.rem1("hallo")); -- output : task removed
System.out.println(period.rem1("Wie gehts?")); -- output : no entry
System.out.println(period.rem1("hallo")); -- output : null
 

mrBrown

Super-Moderator
Mitarbeiter
Nur mit Nutzung von Map gar nicht - du musst dir die Logik dafür selbst schreiben.

Wobei sich da erstmal die Frage stellt, was der Unterschied zwischen task removed, no entry und null sein soll ;)
 

programmer77

Mitglied
Unterschied ist wie folgendes :
public Period() {
zeitPlan.put("hallo", this);
zeitPlan.put("du", this);
zeitPlan.put("da!", this);
}
System.out.println(period.rem1("hallo")); ---> gelöscht
System.out.println(period.rem1("wie gehts")); ---> no entry (weil es nicht vorhanden war)
System.out.println(period.rem1("hallo")); ---> null
 

mrBrown

Super-Moderator
Mitarbeiter
Also ist gelöscht kein Zustand, sondern nur einmalige Ausgabe beim löschen?
Es gibt also im wesentlichen nur einen Unterscheid zwischen nie vorhanden und nicht mehr vorhanden?
 

mrBrown

Super-Moderator
Mitarbeiter
Man könnte Optional darür missbrauchen.

null = nie vorhandne
Optional.empty() = gelöscht
Optional.of(...) = vorhanden
Beim entfernen einfach mit contains prüfen, ob was drin lag, und entsprechende handeln
 

programmer77

Mitglied
mit containsKey(...) kann man überprüfen ob es vorhanden ist oder nicht. Aber wie ist mit der null ?
Z.B
if(!zeitplan.containsKey(aufgabe)){
return "nicht vorhanden";
}
zeitplan.remove(aufgabe);
return "gelöscht";
}
 
X

Xyz1

Gast
Nimm doch bitte Java -Tags, eine Erklärung steht in meiner Sig.

Dann muss sich die Map zusätzlich merken, ob ein String schon mal vorhanden war.

Dafür könnte man value benutzen, oder man nimmt 'ne zweite Map deleted.
 

programmer77

Mitglied
Machen wirs mit etwas Professionalität:
Java:
    public static class Period {

        private final Map<String, Period> zeitPlan = new TreeMap<>();

        public Period() {
            zeitPlan.put("hallo", this);
            zeitPlan.put("du", this);
            zeitPlan.put("da!", this);
        }

        public String rem1(String aufgabe) {
            if (rem2(aufgabe)) {
                return "Geloescht";
            } else {
                return "No Entry";
            }
        }

        private final boolean rem2(String aufgabe) {
            if (zeitPlan.containsKey(aufgabe)) {
                zeitPlan.remove(aufgabe);
                return true;
            } else {
                return false;
            }
        }       
    }
   
    public static void main(String[] args) {
        Period period = new Period();
        System.out.println(period.rem1("hallo"));
        System.out.println(period.rem1("how")); // da muss nicht vorhanden ausgeben.
        System.out.println(period.rem1("hallo")); // da muss null ausgeben. 
    }
 

programmer77

Mitglied
"No Entry" heisst nicht , dass Map leer ist ..
Als Ergebnis kommt "task removed" zurück wenn diese Aufgabe
erfolgreich entfernt wurde, bzw. "no entry" falls die entsprechende
Aufgabe nicht vorhanden war.
 

programmer77

Mitglied
zeitPlan.put("hallo", this);
zeitPlan.put("du", this);
zeitPlan.put("da!", this);
Da haben wir z.B 3 Elemente.
Wenn --> System.out.println(period.rem1("hallo")); ist dann "task removed"
Wenn --> System.out.println(period.rem1("Wie gehts")); ist dann " no entry" (weil wir es vorher nicht hinzugefügt haben. d.h wir haben es nicht. wir haben jetzt nur "du" , "da".)
Wenn --> System.out.println(period.rem1("hallo")); ist dann null, weil es sich gerade in Map nicht befindet.(weil wir es schon gelöscht haben).
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Alles was du in die Map legst, legst du als Optional.of(...) in die Map.
Beim entfernen prüfst du, ob es null ist, dann null.
Sonst ist es entweder Optional.empty oder Optional.of(...), im ersten fall "no entry", im zweiten legst du Optional.empty mit dem gleichen Key in die Map, und gibst "task removed" zurück
 

programmer77

Mitglied
Unten ist die Aufgabestellung - Methode "rem()" ...
Java:
import java.util.Map;
import java.util.TreeMap;


    class Period {
        private String from;
        private String to;

        public Period(String from, String to) {
            this.from = from;
            this.to = to;
        }
        public String from(){
            return from;
        }
        public String to(){
            return to;
        }
    }

    public class Aufgabe1 {
            public static void main(String[] args) {
                Aufgabe1 plan1 = new Aufgabe1();
                Aufgabe1 plan2 = new Aufgabe1();
                Period period = new Period("0.0.2", "0.0.3");
                System.out.println(plan1.add("Sonnenaufgang betrachten", new Period("1.95.0", "2.5.0")));
                System.out.println(plan1.add("Frühstück", new Period("2.15.0", "2.30.0")));
                System.out.println(plan1.add("Muschelsammeln", new Period("3.0.0", "3.50.0")));
System.out.println(plan1.add("Sonnenhut tragen", new Period("2.0.0", "6.0.0")));
                System.out.println(plan1.rem("Sonnenhut tragen")); // removed
                System.out.println(plan1.rem("Abendessen")); // no entry
                System.out.println(plan1.rem("Sonnenhut tragen")); // null

                private Map<String, Period> zeitPlan = new TreeMap<String, Period>();
            }


    public boolean add(String aufgabe, Period period) {
       Period period1 = zeitPlan.put(aufgabe, period);
        if (period1== null) {
            return false;
        }
        return true;
    }

     public String from(String aufgabe) {
        Period period = zeitPlan.get(aufgabe);
        if (period != null) {
            return period.from();
        }
        return null;
    }

    public String to(String aufgabe) {
        Period period = zeitPlan.get(aufgabe);
        if (period != null) {
            return period.to();
        }
        return null;
    }
    // TODO
    /*wird für das Entfernen von Tätigkeiten aus dem Tagesablaufplan
    benötigt; hat einen Parameter vom Typ String und gibt eine Tätigkeit
    an; als Ergebnis kommt "task removed" zurück wenn diese Tätigkeit
    erfolgreich entfernt wurde, bzw. "no entry" falls die entsprechende
    Tätigkeit nicht vorhanden war.*/
    public String rem(String aufgabe) {
        return null // TODO;

    }
   
}
 

mrBrown

Super-Moderator
Mitarbeiter
Hm, Optional ist eigentlich überflüssig.

removen kannst du als put(..., null) sehen, dann gibt es einen unterschied zwischen null und nicht enthalten.
 

Meniskusschaden

Top Contributor
In der main steht für diesen Fall als Kommentar null dabei, das fehlt leider nur unten ;)
Habe ich tatsächlich nicht gesehen. Für mich ist die Aufgabenstellung damit widersprüchlich. Ehrlich gesagt, würde ich da die TODO-Kommentierung für maßgeblich halten, zumal die im Gegensatz zum main-Kommentar auch praktisch sinnvoll ist. Außerdem gehört so eine Spezifikation doch eher an die Stelle der Methoden-Deklaration, als an die Stellen der Verwendung. Deshalb spekuliere ich mal, dass das ein Kommentierungsfehler in der main-Methode ist.
 

mrBrown

Super-Moderator
Mitarbeiter
Habe ich tatsächlich nicht gesehen. Für mich ist die Aufgabenstellung damit widersprüchlich. Ehrlich gesagt, würde ich da die TODO-Kommentierung für maßgeblich halten, zumal die im Gegensatz zum main-Kommentar auch praktisch sinnvoll ist. Außerdem gehört so eine Spezifikation doch eher an die Stelle der Methoden-Deklaration, als an die Stellen der Verwendung. Deshalb spekuliere ich mal, dass das ein Kommentierungsfehler in der main-Methode ist.
Das würde ich auch denken, aber wer weiß, die Steller solcher Aufgaben sind manchmal etwas komisch drauf^^
 

programmer77

Mitglied
Ja in TestCases steht aber null. wenn man versucht ein Element zu löschen, das schon vorher gelöscht wurde. (dann null..)
Es ist nicht so kompliziert. Z.b wir haben "a", "b", "c" .
wenn remove("a") --> dann "Removed"
wenn remove ("d") --> dann " No Entry" (weil wir d nicht haben)
wenn remove("a") --> null (weil es "a" nicht mehr haben)

Was findest du genau so unverständlich ?
 

Meniskusschaden

Top Contributor
Was findest du genau so unverständlich ?
Ich finde daran unverständlich, dass das der Vorgabe des TODO-Kommentars widerspricht. Weiterhin finde ich unverständlich, warum man in diesem Fall überhaupt null als Antwort fordern sollte.
Aber ich bin mir sicher , dass es keinen Fehler gibt
Ich denke schon, dass es mindestens einen Fehler gibt, denn meines Erachtens ist zeitPlan in der main-Methode falsch deklariert, so dass der Code nicht compiliert. Deshalb sind Zweifel angebracht, dass auch bei dem Rest etwas faul ist.
 

programmer77

Mitglied
Ich finde daran unverständlich, dass das der Vorgabe des TODO-Kommentars widerspricht. Weiterhin finde ich unverständlich, warum man in diesem Fall überhaupt null als Antwort fordern sollte.

Ich denke schon, dass es mindestens einen Fehler gibt, denn meines Erachtens ist zeitPlan in der main-Methode falsch deklariert, so dass der Code nicht compiliert. Deshalb sind Zweifel angebracht, dass auch bei dem Rest etwas faul ist.
Sorry, ich habe einen Fehler bei Copy+paste . Das kannst du kompilieren ..
Java:
import java.util.Map;
import java.util.TreeMap;


    class Period {
        private String from;
        private String to;

        public Period(String from, String to) {
            this.from = from;
            this.to = to;
        }
        public String from(){
            return from;
        }
        public String to(){
            return to;
        }
    }

    public class Aufgabe1 {

            public static void main(String[] args) {


                Aufgabe1 plan1 = new Aufgabe1();
                Aufgabe1 plan2 = new Aufgabe1();
                Period period = new Period("0.0.2", "0.0.3");
                System.out.println(plan1.add("Sonnenaufgang betrachten", new Period("1.95.0", "2.5.0")));
                System.out.println(plan1.add("Frühstück", new Period("2.15.0", "2.30.0")));
                System.out.println(plan1.add("Muschelsammeln", new Period("3.0.0", "3.50.0")));
                System.out.println(plan1.add("Sonnenhut tragen", new Period("2.0.0", "6.0.0")));
                System.out.println(plan1.rem("Sonnenhut tragen")); // removed
                System.out.println(plan1.rem("Abendessen")); // no entry
                System.out.println(plan1.rem("Sonnenhut tragen")); // null

            }


    private Map<String, Period> zeitPlan = new TreeMap<String, Period>();



    public boolean add(String aufgabe, Period period) {
       Period period1 = zeitPlan.put(aufgabe, period);
        if (period1== null) {
            return false;
        }
        return true;
    }

     public String from(String aufgabe) {
        Period period = zeitPlan.get(aufgabe);
        if (period != null) {
            return period.from();
        }
        return null;
    }

    public String to(String aufgabe) {
        Period period = zeitPlan.get(aufgabe);
        if (period != null) {
            return period.to();
        }
        return null;
    }
    // TODO
    /*wird für das Entfernen von Tätigkeiten aus dem Tagesablaufplan
    benötigt; hat einen Parameter vom Typ String und gibt eine Tätigkeit
    an; als Ergebnis kommt "task removed" zurück wenn diese Tätigkeit
    erfolgreich entfernt wurde, bzw. "no entry" falls die entsprechende
    Tätigkeit nicht vorhanden war.*/
    public String rem(String aufgabe) {
        return null; // TODO

    }
   
}
 

programmer77

Mitglied
Wie soll ich kontrollieren, ob dieses Element in Map vorhanden ist? Also "no Entry" kann ich leider nicht.
Java:
public String rem(String aufgabe) {
    if (zeitPlan.containsKey(aufgabe)){
        zeitPlan.remove(aufgabe);
        return "removed";
    }
return null;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb remove in for Java Basics - Anfänger-Themen 5
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
D remove arraylist by id not work Java Basics - Anfänger-Themen 6
H Collections JTree remove zeigt keinen Effekt! Java Basics - Anfänger-Themen 8
B Sorting List und Remove Java Basics - Anfänger-Themen 2
Hacer remove at index Java Basics - Anfänger-Themen 31
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
S Vererbung remove elment from Array Java Basics - Anfänger-Themen 0
J easy remove method Java Basics - Anfänger-Themen 1
K Methoden Probleme mit LinkedList.remove(object) Java Basics - Anfänger-Themen 1
U PriorityQueue remove Java Basics - Anfänger-Themen 2
M ArrayList - remove() löscht nicht! - weiß nicht wieso! Java Basics - Anfänger-Themen 8
B map.remove(long) Java Basics - Anfänger-Themen 5
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
B LinkedList remove Java Basics - Anfänger-Themen 5
I Liste Remove erstes Element Java Basics - Anfänger-Themen 5
D Wie Iterator Remove implementieren? Java Basics - Anfänger-Themen 11
W Treemap remove Java Basics - Anfänger-Themen 5
H Remove Methode von List Java Basics - Anfänger-Themen 6
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
C Datentypen ArrayList.remove(index) hinterlässt leeres Feld Java Basics - Anfänger-Themen 5
H TreeMap.remove(value) - und nicht mit key! Geht das? Java Basics - Anfänger-Themen 18
S OOP ArrayList Klasse nachbauen, prob mit remove Java Basics - Anfänger-Themen 5
U ArrayList.remove(i) funktioniert nicht Java Basics - Anfänger-Themen 9
J Remove from an AraayList Java Basics - Anfänger-Themen 8
J Iterator remove()? Java Basics - Anfänger-Themen 5
T ArrayList#remove Java Basics - Anfänger-Themen 8
M ArrayList remove Element? Java Basics - Anfänger-Themen 3
B HashMap remove Java Basics - Anfänger-Themen 2
J TreeSet methode Remove Java Basics - Anfänger-Themen 13
C Add / Remove Panel Java Basics - Anfänger-Themen 2
J remove Problem Java Basics - Anfänger-Themen 8
M remove()-Methode eines Iterators Java Basics - Anfänger-Themen 3
megachucky remove bei Vector klappt nicht Java Basics - Anfänger-Themen 11
M Problem mit Iterator.remove() Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben