# Abfragen, ob schon ein Eintrag in der HashMap steht



## rtt (9. Nov 2004)

Hi,
ich schreibe in eine HachMap eine IP (Key) und die aktuelle Systemzeit (Value).
Wie kann ich abfragen, ob ein Eintrag schon in der HashMap steht oder nicht.
Wenn ja, soll die eingetragene Zeit mit der aktuellen Systemzeit verglichen werden und es soll geprüft werden, ob die eingetragene Systemzeit älter ist als 2 Sekunden.
Wenn sie älter als zwei Sekunden ist, soll der Eintrag überschrieben werden.
Wenn sie nicht älter ist, soll nix passieren.

Hier mal bisheriger code

```
// Abfangen von mehrfachen Klickens mit Hilfe einer Anfragenverwaltung

    HashMap hm = new HashMap();
    		
    long ms = 2000;
    Long time = new Long(System.currentTimeMillis());	// aktuelle Systemzeit     		
    boolean alreadyThere = false;
    		
    		
    // abfragen, ob schon ein Eintrag in der HashMap steht
    if(alreadyThere == true) {
        
        hm.get(ip);
        if(...).... ?
    			
    }
    else if(alreadyThere == false) {
    			
        // Elemente in die Map einfügen
        hm.put(ip,time);
    			
        // Ein Set mit Einträgen holen
        Set set = hm.entrySet();
    		
        // Einen Iterator erzeugen
        Iterator it = set.iterator();
    		
        // Elemente anzeigen lassen
        while(it.hasNext()) {
            Map.Entry me = (Map.Entry)it.next();
            System.out.print(me.getKey() + ": ");
            System.out.println(me.getValue());
        }
    			
        // Übergeben des Requests an die Methode DBentry()
        this.DBentry(image,cmdV,cmd0,cmd1,cmd2,ip,status,model);
    			
        // Wert auf true setzen, da er nun in der Map steht
        alreadyThere = true;
    }
```

Weiß momentan nicht weiter.
Danke für eure Hilfe
Gruß Robin


----------



## bygones (9. Nov 2004)

ob schon allg. etwas drinsteht geht über die größe (size()). über containsKey(Object key)  erfährst du ob es was für den Key gibt...

Ich würde dir die neuen concurrent Klassen von Java empfehlen, da kannst du z.b. beim erstellen einer Map / Collection sagen, wie lange elemente drinnen bleiben dürfen, dann wird sich automatisch drumm gekümmert....


----------



## rtt (9. Nov 2004)

die concurrent Klassen sind aber in der neuen Java5 version drinn oder?


----------



## bygones (9. Nov 2004)

ja... aber sie waren früher eigenständig (wenn du goolgelst mit concurrent java solltest du sie finden)... glaub aber mich nur an eine solche Struktur für Collections zu erinnern....


----------



## rtt (9. Nov 2004)

wie kann ich das in Java 2 machen, da ich nicht ohne weiteres auf Java5 updaten kann.

Das müßten doch nur ein paar if-schleifen seinen oder?
Danke schonmal
Gruß Robin


----------



## Sky (9. Nov 2004)

Eigentlich ganz einfach:


```
Object o = hm.get( ip ); // Object aus der Hashmap holen
alreadyThere = ( o != null ); // Prüfen ob dem Key 'ip' ein Wert in der Hashmap zugewiesen war.
```

Vgl. auch Hashmap#get


----------



## rtt (10. Nov 2004)

und wie kann ich nun prüfen, wie lange der Eintrag schon in der HashMap steht?
Ich hab ja die Systemzeit beim eintragen als Value mit eingetragen. Der Eintrag in der HashMap soll 2 Sekunden gültig sein. Es muß doch also die Eingetragene Systemzeit + Wartezeit (2sek), mit der aktuellen Systemzeit verglichen werden. Nur wie?

Es sind übrigens immer werte den Keys zugeordnet.

Gruß Robin


----------



## rtt (10. Nov 2004)

Hab mal noch etwas rum probiert, aber es funktioniert nicht.
So wie ich es jetzt habe, speichert er den Eintrag nicht in der HashMap.


```
HashMap hm = new HashMap();										// erzeugen einer HashMap
    	System.out.println(hm);
    	    	
    	long ms = 2000;													// zeit, die gewartet wird in millisekunden
		Long time = new Long(System.currentTimeMillis());				// aktuelle Systemzeit (es wird ein Object erzeugt)
    	
    	Object ipx = ip;
    	boolean alreadyThere = false;
    	boolean isIPinHashMap = hm.containsKey(ipx);

    	 	    	
    	// Abfragen, ob schon ein Eintrag in der HashMap steht = nein
    	if(isIPinHashMap == false) {
    		
    		System.out.println("IP ist nicht in HashMap vorhanden");
    		
    		// Elemente in die Map einfügen
    		hm.put(ip,time);
    		System.out.println(hm+"wurde eingetragen");
    		
    		// Ein Set mit Einträgen holen
    		Set set = hm.entrySet();
    	
    		// Einen Iterator erzeugen
    		Iterator it = set.iterator();
    		
    		// Elemente anzeigen lassen
    		while(it.hasNext()) {
    			Map.Entry me = (Map.Entry)it.next();
    			System.out.print(me.getKey() + ": ");
    			System.out.println(me.getValue());
    		}
    			
    		// Übergeben des Requests an die Methode DBentry(), die die Requests in die DB einträgt
    		this.DBentry(image,cmdV,cmd0,cmd1,cmd2,ip,status,model);									
    			
    	}
    	
    		
    	// abfragen, ob schon ein Eintrag in der HashMap steht = ja
    	else if(isIPinHashMap == true){
    		
    		System.out.println("IP ist in HashMap vorhanden");
    		System.out.println(hm);
    		
    	}
```

Wo könnte mein Fehler liegen?
Danke schonmal


----------



## Bleiglanz (10. Nov 2004)

if(x==true) ersetzen durch if(x)

if(x==false) ersetzen durch if(!x)

Object ipx = ip;  // wozu das, erzeugt nur verwirrung

boolean alreadyThere = false;  // wird nicht benutzt

wenn du if(x) elseif(!x) schreibst, dann schreib lieber gleich if-else

überarbeite den ganzen Zeug nochmal und verwende folgendes gerüst

```
if(!hm.containsKey(ip))
{
    // dann put
}
else
{

}
```



> So wie ich es jetzt habe, speichert er den Eintrag nicht in der HashMap.


ja und? geht er in den falschen Zweig beim if? oder was ist das Problem?


----------



## Bleiglanz (10. Nov 2004)

ach ja: hat dein Objekt ip auch schön equals und hashCode überschrieben????


----------



## rtt (10. Nov 2004)

Danke Bleiglanz,
das mit dem "Object ipx=ip;" ist käse gewesen.
Hab den Fehler gefunden, warum er den Eintrag nicht speicherte. Er hat bei jedem durchlauf die HashMap neu angelegt. Erzeuge sie jetzt außerhalb, so das sie nur einmal erzeugt wird. Das funktioniert soweit ganz gut.

Wie kann ich jetzt den Wert der ip auslesen und mit der aktuellen Systemzeit vergleichen?


----------



## rtt (10. Nov 2004)

Hat sich mittlerweile geklärt.
Habs so gemacht:

```
// Abfragen, ob schon ein Eintrag in der HashMap steht = nein
    	if(isIPinHashMap == false) {
    		
    		System.out.println("IP ist nicht in HashMap vorhanden");
    		    		
    		// Elemente in die Map einfügen
    		hm.put(ip,time);
    		System.out.println(hm+" wurde eingetragen");
    		    		
    		// Ein Set mit Einträgen holen
    		Set set = hm.entrySet();
    	    	
    		// Einen Iterator erzeugen
    		Iterator it = set.iterator();
    	    		
    		// Elemente anzeigen lassen
    		while(it.hasNext()) {
    			Map.Entry me = (Map.Entry)it.next();
    			System.out.print(me.getKey() + ": ");
    			System.out.println(me.getValue());
    		}
    		   		
    		// Übergeben des Requests an die Methode DBentry(), die die Requests in die DB einträgt
    		this.DBentry(image,cmdV,cmd0,cmd1,cmd2,ip,status,model);		
    	}
    	
    		
    	// abfragen, ob schon ein Eintrag in der HashMap steht = ja
    	else if(isIPinHashMap == true){
    		
    		if (status.equals("finished")) {
    			hm.remove(ip);
    			System.out.println("Request status is finished. Remove IP from HashMap");
    		}
    		else if (status.equals("unfinished")){
    		
    			System.out.println("IP ist in HashMap vorhanden");
    			//System.out.println(hm);
    		
    			// Ein Set mit Einträgen holen und einen Iterator erzeugen
    			Set set = hm.entrySet();
    			Iterator it = set.iterator();
    	    
    	    		
    			// Elemente anzeigen lassen und prüfen auf gültigkeit
    			while(it.hasNext()) {
    				Map.Entry me = (Map.Entry)it.next();
    				
    				long time_value = ((Long)hm.get(ip)).longValue();					// aus der Hashmap holen und einem long wert zuordnen
    				System.out.println(time_value);
    			
    				if (System.currentTimeMillis() <= (time_value + ms)) {
    					System.out.println("IP ist noch gültig");
    					break;
    				}	
    				else if(System.currentTimeMillis() > (time_value + ms)){
    					System.out.println("IP ist nicht mehr gültig");
    					// Übergeben des Requests an die Methode DBentry(), die die Requests in die DB einträgt
    					this.DBentry(image,cmdV,cmd0,cmd1,cmd2,ip,status,model);
    				}
    			}
    			
    		} 									 
			
    	}
```

Gruß Robin


----------

