# HashMap containsKey liefert immer false zurück



## Slymenstra (17. Dez 2010)

Hallo Forum,

ich habe eine Hashmap. In der Hashmap fehlen Schlüssel, die ich rauskriegen möchte. 
Dazu habe ich eine Liste erstellt, die alle Schlüssel beinhaltet, die es eigentlich geben sollte.  Die Liste heißt names im Beispiel und die Hashmap heißt namesHash.


```
System.out.println(names.contains(namesHash.containsKey(names.get(0))));
System.out.println(names.get(0));

        for(Map.Entry e1 : namesHash.entrySet()){
            String key1 = e1.getKey().toString();
            if(key1.equals("||/locus_tag=LVIS_0001")){
                System.out.println("Value zu Key: " + key1 + "\t" + e1.getValue());
            }
        }
```

die Ausgabe ist:
false
||/lalala=LVIS_0001 
Value zu Key: ||/lalala=LVIS_0001        ||/lalala=LVIS_0001 ||/product=DNA replication ATPase initiation

Also irgendwie scheint die containsKey Abfrage nicht zu funktionierenm aber ich weiß nicht warum.


----------



## SlaterB (17. Dez 2010)

http://www.java-forum.org/allgemeine-java-themen/110484-string-vergleich-contains-funktioniert.html
gleiches Thema oder Zufall?

gehe nach meiner Anleitung dort 
http://www.java-forum.org/allgemein...rgleich-contains-funktioniert.html#post709875
vor:

extrahiere den key1 aus dem if in eine Variablen x, außerdem names.get(0) in eine Variablen y,
was ergibt x.equals(y)?
wie lang sind die beiden Strings jeweils (Leerzeichen sieht man in der Ausgabe nicht)?
notfalls Zeichen für Zeichen vergleichen

bzw. vergleiche einfach y = names.get(0) mit "||/locus_tag=LVIS_0001"


----------



## Slymenstra (17. Dez 2010)

Die Vergleiche liefern immer false. 
Hab in beide Richtungen gesucht.

 gleiches Thema, ich habe zwar gegoogelt, aber das nicht gefunden.


----------



## SlaterB (17. Dez 2010)

ungenaue Antwort, 
hast du jetzt nur equals ausgeführt oder auch die Längen und die einzelnen Zeichen vergleichen?

edit:
selbst wenn ich dein Posting zitiere kann ich das Leerzeichen am Ende der zweiten Zeile der Ausgabe sehen 


```
false####
||/lalala=LVIS_0001 #####
```


----------



## Slymenstra (17. Dez 2010)

Tschuldige, also ich habe mit equals verglichen, das liefert false zurück in beide richtungen. also einmal variable aus hashmap x und variable aus liste y 
x.equals(y)
y.equals(x)

dann habe ich die Länge verglichen, da hast du Recht, da ist ein Leerzeichen, wenn ich das abschneide und die gleiche Länge habe, dann liefert das contains leider immer noch false zurück. 

Jetzt müsste ich zeichenweise vergleichen. Weißt du, ob's da vielleicht von Java schon was gibt?


----------



## SlaterB (17. Dez 2010)

> wenn ich das abschneide und die gleiche Länge habe, dann liefert das contains leider immer noch false zurück. 

Code Code Code

wenn du

```
String x = "aaa"
x.substring(0,1);
// etwas mit x machen
```
hast, dann ist x immer noch 3 Zeichen lang, 
Strings sind unveränderlich, es müsste [c]x = x.substring(0,1);[/c] heißen

------

> Jetzt müsste ich zeichenweise vergleichen. Weißt du, ob's da vielleicht von Java schon was gibt? 

...
gerade weil das, was es schon gibt (contains, equals usw.) viele interne Dinge macht, die du im Endergebnis kaum verstehst,
sollst du doch gerade manuell selber die tiefen Details anschauen,
eine for-Schleife mit charAt() ist doch nicht zuviel verlangt, falls es nicht eh wahrscheinlicher am Leerzeichen liegt


----------



## SebastianM (17. Dez 2010)

Bin ich blind oder ist deine erste Abfrage einfach Unsinn?


Slymenstra hat gesagt.:


> System.out.println(names.contains(namesHash.containsKey(names.get(0))));



containsKey() liefert einen boolean, warum testest du den nochmal auf names.contains(...) ? Logisch dass das erste println() immer false ausgibt.


----------



## Reggie (18. Dez 2010)

Stimmt schon!

```
System.out.println(names.contains(namesHash.containsKey(names.get(0))));
```
Hier wird Ein String abgefragt ob dieser einen Boolaen enthält. Und das wird nie sein.

```
System.out.println(names.contains(namesHash.get(names.get(0))));
```
Wird wahrscheindlich das gewünschte Ergebnis bringen.


----------



## Landei (18. Dez 2010)

Nebenbei: Man sollte schon Generics verwenden, etwa

```
Map<Integer, Double> map = ...
for(Map.Entry<Integer, Double> entry : map.entrySet()) {
  //keine casts notwendig 
  Integer i = entry.getKey(); 
  Double d = entry.getValue();
  ... 
}
```


----------



## Slymenstra (20. Dez 2010)

Danke für die vielen Tipps.

Der Code zum String-Abschneiden schaut so aus:

```
s = s.substring(0, (s.length())-1);
names.add(s);
```

Wenn ich dann die "contains"-Abfrage mache:

```
System.out.println(names.contains(namesHash.get(names.get(0))));
```
krieg ich immer noch false

Ich suche mal weiter, vielleicht finde ich den Fehler ja noch vor Weihnachten.


----------



## Gast2 (20. Dez 2010)

Poste doch mal nen KSKB in dem man den Fehler nachvollziehen kann.


----------



## DerEisteeTrinker (20. Dez 2010)

Ich würde dir empfehlen mal den Debugger anzuwerfen und zu schauen, ob der Key überhaupt drin steht in der Map und dann versuch mal die Strings getrimmt zu vergleichen und auch getrimmt den Key einzufügen


----------



## SlaterB (20. Dez 2010)

dass
> System.out.println(names.contains(namesHash.get(names.get(0))));
bzw. ähnliche Konstrukte nicht besonders sinnvoll sind wurde auch schon geschrieben,
nur equals zwischen zwei Strings ist interessant


```
public class Test
{
    public static void main(String[] args)
    {
        String x = "a";
        String s = "a ";
        System.out.println(s.equals(x));
        s = s.substring(0, s.length() - 1);
        System.out.println(s + "#");
        System.out.println(s.equals(x));
    }
}
```


----------



## Slymenstra (20. Dez 2010)

Ich schaue meine Eingabe nochmal ganz genau an. :rtfm:
Vielleicht liegt da mein Problem.

equals zwischen zwei Strings liefert false zurück.

```
String name1 = names.get(0);
System.out.println(key1.equals(name1));
```


----------



## DerEisteeTrinker (20. Dez 2010)

Für solche Sachen fleißig mit Log-Einträgen um dich werfen und alles aufschreiben. Wenn du dann die Anwendung produktiv gibst, dann kannst den Log-Level wieder hochschrauben und die Sache ist geritzt


----------



## bygones (20. Dez 2010)

Slymenstra hat gesagt.:


> equals zwischen zwei Strings liefert false zurück.
> 
> ```
> String name1 = names.get(0);
> ...


Dann sind es 2 verschiedene Strings.... bei gleichen String gibts auch richtig IMMER true zurück


----------

