Check ob eine HashMap schon existiert

ChristophK

Mitglied
Hallo,

ich habe eine Observer Klasse, die immer eine Nachricht an eine andere Klasse sendet, die diese Nachricht dann verarbeitet.
Jetzt möchte ich in der verarbeitenden Klasse eine HashMap nutzen. Dabei macht es ja wenig Sinn, wenn ich immer wieder eine neue HashMap erstelle. Gibt es eine Methode um zu überprüfen, ob eine HashMap vorhanden ist und wenn es keine gibt soll eine neue erstellt werden?

Ich dachte mir, dass ich schaue, ob ein Wert in dem HashMap Objekt steht. Dies geht aber nicht, wenn ich noch keine HashMap habe 🙁
 
Java:
 if(myMapVariable == null)

Wenn ich
Java:
HashMap<String, String> map = null;
if(map == null) {..}
else { map = new HashMap<String, String>();}

nutze, komme ich mir dann nicht in die Quere? Oder wie soll ich die Variable für das Objekt erstellen? (Mache mir sorgen, dass es dann immer null ist und immer ein neues Objekt erzeugt wird)
 
Erstens:
Java:
HashMap<String, String> map = null;
if(map == null) {..}
else { map = new HashMap<String, String>();}

Das macht keinen Sinn. Du deklarierst eine neue Variable die null ist. dann prüfst du darauf, was immer zu dem selben Ergebnis führt und erstellst erst dann eine neue HashMap, wenn die Variable bereits eine enthält?
Das kann so ich funktionieren.

Zweitens:
Lerne die Grundlagen. Ich habe hier den Eindruck, dass es an diesen mangelt. Es wird überhaupt nicht klar, was du mit deiner HasMap machen willst und ob du diese als Instanzvariable oder als lokale variable deklarierst.
 
Erstens:
Java:
HashMap<String, String> map = null;
if(map == null) {..}
else { map = new HashMap<String, String>();}

Das macht keinen Sinn. Du deklarierst eine neue Variable die null ist. dann prüfst du darauf, was immer zu dem selben Ergebnis führt und erstellst erst dann eine neue HashMap, wenn die Variable bereits eine enthält?
Das kann so ich funktionieren.

Zweitens:
Lerne die Grundlagen. Ich habe hier den Eindruck, dass es an diesen mangelt. Es wird überhaupt nicht klar, was du mit deiner HasMap machen willst und ob du diese als Instanzvariable oder als lokale variable deklarierst.

Zur HashMap:
Ich bekomme von einem Server eine Nachricht gesendet. Diese Nachricht übertrage ich mittels einer Klasse an meine "Fabrik". In der Fabrik sind alle Berechnungen enthalten. Jetzt kann es sein ich bekomme eine PositionMessage, um hierbei die Position zu berechnen brauche ich eine Nachricht die "odd" und eine die "even" ist. Die Nachrichten kann ich eindeutig mit einem Schlüssel zueinander zuordnen.

Jetzt kommt der Fall ich bekomme eine Nachricht von "P001" die odd ist. Bisher habe ich aber noch keine Nachricht von "P001" erhalten -> speichern. Hierfür die Hashmap. Nun bekomme ich eine Nachricht von "P002" -> nicht vorhanden abspeichern. Jetzt erhalte ich von "P001" eine even Nachricht -> die odd Nachricht aus der HashMap lesen und dann mit beiden Nachrichten die Berechnung durchführen.
 
HashMap hat eine Contains-Methode.

Ohne den Code zu sehen, können wir hier nicht weiter helfen außer allgemeine Aussagen zu treffen.

Mein Code
Mutterklasse
Java:
 public class Senser {
	//...
                SentenceFactoryInterface sf = new SentenceFactory();
                
		while (true) {
			// senser uses StreamingWebClient
			//String server_message = wc.readChunk(filter);
                       
                        String server_message = (String) client.get();
			// connection sentenceFactory creates Sentence
			// server message wird in Sentence �bersetzt
			
			ADSBMessage message = sf.fromWebdisJson(server_message);
			// System.out.println (sentence);
			ADSBMessageDisplay MessageDisplay = new ADSBMessageDisplay();
			MessageDisplay.print(message);
		}
	}
}

Kind
Java:
import java.util.*;

public class SentenceFactory implements SentenceFactoryInterface {

    public ADSBMessage fromWebdisJson(String json) {
        String rawSentence, dfca, icao, payload, parity, type;
        HashMap<String, String> map;

        // ...
        
        // variables for position message
        int altitude, longitude, latitude, lat0, lat1, lon0, lon1;
        char qbit, format;
        String hashIcao;

	// check whether we got a correct JSON Sentence
        // {"subscribe":["message","ads.sentence","1381236091.8042176!ADS-B*8D3C6DD25819B0699A075E167303;\r\n"]}
        rawSentence = json.substring(json.indexOf("*") + 1, json.indexOf("*") + 29);

        // get the indexes of the different parts of the sentence
        int dfcaIndex = json.indexOf("*") + 1;
        int icaoIndex = dfcaIndex + 2;
        int payloadIndex = icaoIndex + 6;
        
        // create hashmap 
        
        if(map == null) {
            
        }
        else {
            map = new HashMap<String, String>(); 
        }
        
        //check if it is a ads b sentence
        if (json.contains("!ADS-B*")) {
            
            //create the substrings
            icao = json.substring(icaoIndex, icaoIndex + 6);
            payload = json.substring(payloadIndex, payloadIndex + 14);

            //convert the payload to bin and calculate the type
            String payloadBin = hexToBinary(payload);
            String payloadFirstFive = payloadBin.substring(0, 5);
            int payloadTypeValue = binaryToDecimal(payloadFirstFive);

 // ...   
            
            // Airborne Position Message
            if (payloadTypeValue >= 9 && payloadTypeValue <= 18 || payloadTypeValue >= 20 && payloadTypeValue <= 22 ) {
                // get format
                format = payloadBin.charAt(21);
                
                // check if other message is in hashmap
                if(map.containsKey(icao)){
                    // get the payload of the other message
                    hashIcao = map.get(icao);
                    
                    //check the format of both messages
                    if(format == hashIcao.charAt(21)) {
                        //Überschreiben
                    }
                    if(format != hashIcao.charAt(21)) {
                        //calculate the altitude (newer message)
                        altitude = binaryToDecimal(payloadBin.substring(8,15) + payloadBin.substring(16,20));
                        qbit = payloadBin.charAt(15);
                        if(qbit == 0) {
                            altitude = (altitude * 25) - 1000;
                        }
                        if(qbit == 1) {
                            altitude = (altitude * 100) - 1000;
                        }
                        
                        // get the even and odd longitude and latitude
                        
                        // when my new message is even
                        if(format == 0) {
                            lat0 = binaryToDecimal(payloadBin.substring(22,39));
                            lon0 = binaryToDecimal(payloadBin.substring(39));
                            lat1 = binaryToDecimal(hashIcao.substring(22,39));
                            lon1 = binaryToDecimal(hashIcao.substring(39));
                        }
                        
                        // when my new message is odd
                        if(format == 1) {
                            lat0 = binaryToDecimal(hashIcao.substring(22,39));
                            lon0 = binaryToDecimal(hashIcao.substring(39));
                            lat1 = binaryToDecimal(payloadBin.substring(22,39));
                            lon1 = binaryToDecimal(payloadBin.substring(39));
                        }
                        
                        
                        
                        // alte nachricht aus hash löschen
                        return new ADSBMessage (icao, payloadTypeValue, altitude, longitude, latitude);
                    }
                }
                
                // wenn keine nachricht mit demselben icao -> einfügen
            }
            
            //...
            
            // Other Message
            return new ADSBMessage (icao, payloadTypeValue);
        }    
        
        // Fallback
        return new ADSBMessage();
    }
//...
}
 
Bei jedem Aufruf von fromWebdisJson wird eine neue HashMap erzeugt. Wie soll die den schon Werte enthalten?

Vor allem wird da nie was eingefügt.

Soweit bin ich noch gar nicht... Mir ist bewusst, dass es sinnlos ist bei jedem Aufruf eine neue HashMap zu erzeugen, deshalb war meine Idee ich schaue erst einmal ob es schon eine HashMap gibt. Leider weiß ich nicht, wie ich das am besten anstelle oder ob es eine andere Lösung gibt.
 
spricht irgendwas dagegen, das Handling der Map in eine eigene Klasse auszulagern?

Java:
public class MapHandler {

    private HashMap<String,String> map = null;
    
    public HashMap<String, String> getMap()
    {
        if (this.map == null)
            return new HashMap<>();
        return this.map;
    }
    
    public void setMap(HashMap<String,String> map)
    {
        this.map = map;
    }
    
}
 
Zuletzt bearbeitet:
Es wirkt übertrieben für ein simples var == null eine eigene Klasse zu bauen die dann nichts anderes als ein Object-Holder ist^^

Außerdem: mapHandler -> MapHandler
 

Zurück
Oben