HashMap Methode "get()"-Problem

AkechiKogoro

Mitglied
Hallo an alle im Java-Forum,

Ich habe ( wie folgt ) eine HashMap für ein Kartenspiel erstellt, die als Key Objekt ein Integer und als Value Objekt ein String beinhaltet.
deck = new HashMap<Integer, String>();
Nun habe ich diese folgendermaßen "gefüttert".
Java:
deck.put(1, "Pik  Sieben");
deck.put(2, "Karo Sieben");
deck.put(3, "KreuzSieben");


usw.
Folgende if-Anweisung sollte dann einen Anweisungsblock auslösen, jedoch stürzt das Programm dabei immer ab (der zaehler ist dabei eine Zufallszahl).
Java:
if( deck.get(zaehler).charAt(0) == 'K' && deck.get(zaehler).charAt(1) == 'a' ) {
    .
    .
    .}
An den Anweisungen im Anweisungsblock liegt es nicht ( die sind nämlich auch sehr einfach). Ich habe dazu mal ein wenig rumexperimentiert und weiß nun dass das Programm bei der Anweisung deck.get(zaehler).charAt(0) == 'K' ( und ähnliche ) scheitert.
Ich hoffe mir kann hier jemand einen Rat geben wie die Anweisung alternativ aussehen könnte, damit das Ganze doch noch funktioniert.

Vielen Dank schonmal im voraus.

Mit freundlichen Grüßen
euer Akechi Kogoro
 
Zuletzt bearbeitet von einem Moderator:

httpdigest

Top Contributor
Deine Zufallszahlen, mit denen du als key den map lookup machst, liegen offensichtlich nicht im Bereich 1 (incl.) bis 3 (incl.). Als Folge liefert map.get null und auf null rufst du dann charAt auf, was zu einer NullPointerException führt.
 

AkechiKogoro

Mitglied
Das dachte ich mir auch erst, weswegen ich den Zufallsgenerator zwischenzeitlich entfernt hatte und für den zaehler einfach nur einen int-Wert von 1 verwendet habe. Das hätte ja dann klappen müssen, aber auch dabei ist das Programm an eben jener Stelle abgeschmiert.
 

httpdigest

Top Contributor
Naja, dann ist z.B.:
- `deck` selbst null
- `deck` enthält gar keine Map-Einträge
Nutze einfach einen Debugger in einer IDE deiner Wahl. Dann findest du die Ursache in Sekundenschnelle.
 

AkechiKogoro

Mitglied
Das Programm führt die if-Anweisung einfach nicht aus, weil es mit der Anweisung deck.get(zaehler).charAt(0) == 'K' ]nichts anzufangen weiß. Ich habe aber inzwischen selbst eine Lösung gefunden. Das mag vielleicht brachial erscheinen, aber so klappt es: String.valueOf(deck.get(zaehler)).charAt(0) == 'K'.

Vielen Dank euch trotzdem.

Nun bin ich aber noch auf ein anderes Problem gestoßen. Wenn ich die Methode remove( Objekt key ) verwende wird ja nur der zu dem key zugehörige String ( in meinem Beispiel ) gelöscht. Wie kann ich jedoch den Wert ( String ) und den key löschen?
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Das Programm führt die if-Anweisung einfach nicht aus, weil es mit der Anweisung deck.get(zaehler).charAt(0) == 'K' nichts anzufangen weiß. Ich habe aber inzwischen selbst eine Lösung gefunden. Das mag vielleicht brachial erscheinen, aber so klappt es: String.valueOf(deck.get(zaehler)).charAt(0) == 'K'.

Wie hast du deck deklariert?


Nun bin ich aber noch auf ein anderes Problem gestoßen. Wenn ich die Methode remove( Objekt key ) verwende wird ja nur der zu dem key zugehörige String ( in meinem Beispiel ) gelöscht. Wie kann ich jedoch den Wert ( String ) und den key löschen?
Der Eintrag bestehend aus Key und Value wird entfernt, remove ist da schon das richtige
 

AkechiKogoro

Mitglied
Hallo mrBrown,

ich habe mein deck folgendermaßen deklariert:
private HashMap<Integer, String> deck = deck = new HashMap<Integer, String>()

Der Eintrag bestehend aus Key und Value wird entfernt, remove ist da schon das richtige

Naja, ich dachte auch das
remove( Objekt key ), aber aus irgendeinem Grund gibt die folgende while-Schleife dennoch
entweder Karten ( also deren zugehörige Strings ) aus die eigentlich schon mit remove gelöscht sein müssten oder teilweise gar keine ( gleich zu Beginn des Spiels sollen 5 angezeigt werden und entweder gibt es dabei Lücken oder doppelte Karten ).


while( kartenZaehler <= 5 ) {
try {
zufallszahl = zufallsGenerator.nextInt(32) + 1;
hand1.put( kartenZaehler, deck.get(zufallszahl));
deck.remove(zufallszahl);
kartenZaehler++;
} catch( NullPointerException e ) {

}
}
 

mihe7

Top Contributor
Das Programm führt die if-Anweisung einfach nicht aus, weil es mit der Anweisung deck.get(zaehler).charAt(0) == 'K']nichts anzufangen weiß. Ich habe aber inzwischen selbst eine Lösung gefunden. Das mag vielleicht brachial erscheinen, aber so klappt es:String.valueOf(deck.get(zaehler)).charAt(0) == 'K'.
Ja, weil bei Dir für einen zaehler gilt: deck.get(zaehler) == null. Das String.valueOf() sorgt einfach dafür, dass im Fall von null der String "null" verwendet wird und Du somit keine NullPointerException erhältst.

Nachtrag: Alles, was Du damit erreichst, ist, dass Du einen Fehler an dieser Stelle versteckst. Irgendwann fällt er Dir vermutlich auf die Füße und wenn Du Dich an diese Stelle nicht mehr erinnerst, suchst Du Dich dumm und dusselig.
 
X

Xyz1

Gast
Ich denke, Du suchst das um die Farbe herauszufinden:
Java:
import java.util.HashMap;
import java.util.function.Consumer;

public class Aw1 {
    private HashMap<Integer, String> kmap = new HashMap<>();

    void put_in_kmap() {
        if (kmap.isEmpty()) {
            kmap.put(1, "Karo Sieben");
            kmap.put(2, "Herz Sieben");
            kmap.put(3, "Pik Sieben");
            kmap.put(4, "Kreuz Sieben");
            kmap.put(5, "Karo Acht");
            kmap.put(6, "Herz Acht");
            kmap.put(7, "Pik Acht");
            kmap.put(8, "Kreuz Acht");
            // usw
        }
    }

    int get_color_i(int i) {
        return (i - 1) % 4;
    }

    void do_for_color_i(Consumer c1, Consumer c2, Consumer c3, Consumer c4) {
        for (int i = 1; i <= kmap.size(); i++) { // bei 1 anfangen
            switch (get_color_i(i)) {
            case 0:
                c1.accept(kmap.get(i));
                break;
            case 1:
                c2.accept(kmap.get(i));
                break;
            case 2:
                c3.accept(kmap.get(i));
                break;
            case 3:
                c4.accept(kmap.get(i));
                break;
            default:
                break;
            }
        }
    }

    String get_color_s(int i) {
        return kmap.get(i).split(" ")[0];
    }

    void do_for_color_s(Consumer c1, Consumer c2, Consumer c3, Consumer c4) {
        for (int i = 1; i <= kmap.size(); i++) {
            switch (get_color_s(i)) {
            case "Karo":
                c1.accept(kmap.get(i));
                break;
            case "Herz":
                c2.accept(kmap.get(i));
                break;
            case "Pik":
                c3.accept(kmap.get(i));
                break;
            case "Kreuz":
                c4.accept(kmap.get(i));
                break;
            default:
                break;
            }
        }
    }

    public static void main(String[] args) {
        Aw1 a = new Aw1();
        a.put_in_kmap();
        a.do_for_color_i((x) -> System.out.println(x + " hat die Farbe Karo"),
                (x) -> System.out.println(x + " hat die Farbe Herz"),
                (x) -> System.out.println(x + " hat die Farbe Pik"),
                (x) -> System.out.println(x + " hat die Farbe Kreuz"));
        a.do_for_color_s((x) -> System.out.println(x + " hat die Farbe Karo"),
                (x) -> System.out.println(x + " hat die Farbe Herz"),
                (x) -> System.out.println(x + " hat die Farbe Pik"),
                (x) -> System.out.println(x + " hat die Farbe Kreuz"));
    }
}
 
X

Xyz1

Gast
Kannst du mir erklären, wie Consumer funktionieren?
Ja, Consumer sind Funktionale Interfaces mit genau einer Methode "accept", welche genau einen Parameter haben und für den beliebige "Sachen" ausgeführt werden können. Da sie funktional sind (und generisch), lässt sich einfach eine Lambda Ausdruck schreiben ,der Form (element) -> doSthWithEle(element);. Sie werden also für den Konsum für jedes Element aufgerufen. Mehr Magic verbirgt sich dahinter nicht. Cosumer gibt's seit Java 8.

Consumer braucht man also, wenn man Code nicht statisch/ variabel/ austauschbar halten will. Lose Kopplung, hohe Kohäsion.
 

Wurstkopp

Bekanntes Mitglied
Vermutlich wäre es aber einfacher sich eine sinnvolle Klasse für die Karten und deren Eigenschaften auszudenken, statt immer on demand deren Eigenschaften aus einem String rauszuparsen.
 
X

Xyz1

Gast
Vermutlich wäre es aber einfacher sich eine sinnvolle Klasse für die Karten und deren Eigenschaften auszudenken, statt immer on demand deren Eigenschaften aus einem String rauszuparsen.
Das ist ganz klar,... aber wenn er es schon einmal so hat?

Außerdem mache ich kein komplettes Refactoring von noch unbekanntem Code. :D
 

AkechiKogoro

Mitglied
Ja, weil bei Dir für einen zaehler gilt: deck.get(zaehler) == null. Das String.valueOf() sorgt einfach dafür, dass im Fall von null der String "null" verwendet wird und Du somit keine NullPointerException erhältst.

Nachtrag: Alles, was Du damit erreichst, ist, dass Du einen Fehler an dieser Stelle versteckst. Irgendwann fällt er Dir vermutlich auf die Füße und wenn Du Dich an diese Stelle nicht mehr erinnerst, suchst Du Dich dumm und dusselig.

Das hatte ich mir auch schon gedacht, aber man darf dabei nicht vergessen dass die Schlüsselwertzuordnungen auch lediglich Objekte sind ( sie müssen nicht zwangsläufig ein String sein bzw. beinhalten ). Daher kann dieses durch String.valueOf( Objekt ) ( in diesem Fall ) in einen String umgewandelt werden. Ich war mir da zunächst auch nicht sicher, aber es funktioniert.

Nun habe ich dennoch eine Frage an das Forum:
Wenn man die hashMap-Methode "boolean isEmpty()" verwendet, bekommt man da als Ergebnis "true" wenn die Schlüssel keine Schlüsselwerte mehr enthalten ( in dem Fall hier sind das Strings ) oder wenn erst dann wenn die hasMap überhaupt keine key´s und value`s mehr beinhaltet?
 

mihe7

Top Contributor
Das hatte ich mir auch schon gedacht, aber man darf dabei nicht vergessen dass die Schlüsselwertzuordnungen auch lediglich Objekte sind ( sie müssen nicht zwangsläufig ein String sein bzw. beinhalten ). Daher kann dieses durch String.valueOf( Objekt ) ( in diesem Fall ) in einen String umgewandelt werden. Ich war mir da zunächst auch nicht sicher, aber es funktioniert.
Was willst Du mir jetzt damit sagen?!? Die Sache ist ganz einfach: wäre Dein Code korrekt, bräuchtest Du kein String.valueOf(). Du behandelst damit nicht das Problem, sondern nur das Symptom.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn man die hashMap-Methode "boolean isEmpty()" verwendet, bekommt man da als Ergebnis "true" wenn die Schlüssel keine Schlüsselwerte mehr enthalten ( in dem Fall hier sind das Strings ) oder wenn erst dann wenn die hasMap überhaupt keine key´s und value`s mehr beinhaltet?
Ist das nicht beides das selbe? In der Map können keine Schlüssel ohne Wert liegen und man kann nicht nur die Werte entfernen.
 
X

Xyz1

Gast
Na-gut - je nachdem wie man das sieht. ;)

(Ein leerer String als Schlüsseln wäre ja auch denkbar)
 

Wurstkopp

Bekanntes Mitglied
Ja, null ist sowohl gültiger Schlüssel als auch Wert.


Gibt deshalb aber trotzdem keine Schlüssel ohne Wert :)


Java:
HashMap<String, String> m = new HashMap<>();

m.put("a", null);
m.put("b", null);
m.put(null, null);

System.out.println(m.keySet()); // => [null, a, b]
System.out.println(m.containsKey("a")); // => true


Tatsächlich schon. Sollte man aber imo eher nicht so verwenden.
 
Zuletzt bearbeitet:
X

Xyz1

Gast
@Wurstkopp Es ging um die Frage, ob eine Map mit null-Werten/-Schlüsseln leer ist oder nicht. Dass man das eher nicht so verwenden sollte das liegt absolut auf der Hand.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
HashMap<String, String> m = new HashMap<>();

m.put("a", null);
m.put("b", null);
m.put(null, null);

System.out.println(m.keySet()); // => [null, a, b]
System.out.println(m.containsKey("a")); // => true


Tatsächlich schon. Sollte man aber imo eher nicht so verwenden.
Ich bin mir nicht sicher, ob das jetzt eine Bestätigung oder der Versuch eines Widerspruchs ist, aber in deinem Beispiel gibt es drei Schlüssel (null, a, b), und zu jedem der Schlüssel einen Wert (null, null, null)

m.containsValue(null) würde vollkommen korrekt true zurückliefern, genauso wie m.values() eine Collection mit drei Elementen liefert.

Also: keine Schlüssel ohne Wert, keine Werte ohne Schlüssel, sondern immer beides zusammen.
 

Wurstkopp

Bekanntes Mitglied
Wenn mir jemand sagt, die Variable hat "keinen Wert", interpretiere ich das als "null". Aber hier geht es jetzt nur noch um Haarspalterei, also lassen wir das.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
T HashMap values Bearbeitung Allgemeine Java-Themen 4
T Hashmap Values Bearbeitung Allgemeine Java-Themen 1
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
killig HashMap mit if-Anweisung überprüfen Allgemeine Java-Themen 4
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
L HashMap Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
B HashMap Duplikate Allgemeine Java-Themen 4
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Tabelle aus CSV, 2 dimensionale HashMap? Allgemeine Java-Themen 4
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
JavaWolf165 JsonObject in HashMap umwandeln Allgemeine Java-Themen 16
R ArrayList und HashMap Allgemeine Java-Themen 7
L Assoziatives Datenfeld, schneller wie Hashmap Allgemeine Java-Themen 35
G Methoden HashMap speichert unter falschen Schlüsseln Allgemeine Java-Themen 6
D Verschachtelte HashMap initializieren Allgemeine Java-Themen 1
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
R Hierarchie mit HashMap darstellen Allgemeine Java-Themen 19
D Datentypen HashCollision in HashMap Allgemeine Java-Themen 3
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B Userdaten in Hashmap speichern - Servlet Allgemeine Java-Themen 6
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
M Füllfaktor einer Hashmap Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
D Datentypen HashMap Allgemeine Java-Themen 5
R Collections Performance einer HashMap Allgemeine Java-Themen 26
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
T Erste Schritte HashMap<String, int> Allgemeine Java-Themen 2
K Hashmap sortieren Allgemeine Java-Themen 6
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
S HashMap containsKey liefert immer false zurück Allgemeine Java-Themen 15
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
K HashMap sorting verhindern Allgemeine Java-Themen 10
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
L HashMap mit Enum Keys Allgemeine Java-Themen 3
J Array als Schlüssel für HashMap Allgemeine Java-Themen 6
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
V Hashmap-Frage Allgemeine Java-Themen 3
M HashMap - Ich bin verwirrt Allgemeine Java-Themen 3
H2SO3- multiple Hashmap Allgemeine Java-Themen 5
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J NullPointerException mit HashMap Allgemeine Java-Themen 2
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
I HashMap Problem... Allgemeine Java-Themen 3
C HashMap Allgemeine Java-Themen 12
Daniel_L Map/HashMap - Reihenfolge von Einträgen Allgemeine Java-Themen 4
L HashMap Key Reihenfolge umkehren Allgemeine Java-Themen 8
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
J Inhalt von HashMap vergleichen Allgemeine Java-Themen 3
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
T Hashmap füllen mit rs sortierung Allgemeine Java-Themen 9
D HashMap sortieren Allgemeine Java-Themen 2
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
D HashMap Problem Allgemeine Java-Themen 14
G Runnables aus Hashmap starten Allgemeine Java-Themen 4
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G HashMap key ändern Allgemeine Java-Themen 5
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
S Problem mit Hashmap Allgemeine Java-Themen 2
G Datei einlesen und in HashMap verarbeiten Allgemeine Java-Themen 3
E Auslesen aus Hashmap Allgemeine Java-Themen 3
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
alexpetri hashmap bästpractice Allgemeine Java-Themen 4
J HashMap mit Webservice realisierbar? Allgemeine Java-Themen 4
ARadauer hashmap vs hastable Allgemeine Java-Themen 5
T HashMap#values Reihenfolge Allgemeine Java-Themen 13
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
L Wie kann ich eine HashMap abspeichern? Allgemeine Java-Themen 3
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P List in Hashmap schreiben Allgemeine Java-Themen 5
M Threads in einer Hashmap Allgemeine Java-Themen 5
P HashMap an 2 Stellen veränderbar Allgemeine Java-Themen 13
P HashMap auflösen Allgemeine Java-Themen 9
MQue HashMap durchlaufen Allgemeine Java-Themen 2
MQue HashMap Allgemeine Java-Themen 2
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 9
MQue Sichtbarkeit/HashMap/NullPointerexception Allgemeine Java-Themen 2
B HashMap.containsKey. Allgemeine Java-Themen 10
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Klasse in HashMap speichern Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
M HashMap sortiert Allgemeine Java-Themen 6
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben