2012-04-06 15 views
3

Ich habe eine Java HashMap mit Float-Schlüssel und String-Werte. Jetzt, wo ein Float gegeben wird, der nicht in der HashMap ist, wie kann ich den Schlüssel finden, der dem gegebenen Float am ähnlichsten ist?Java HashMap finden am besten passenden Schlüssel

+1

ich Ihnen vorschlagen, absolut zu vermeiden, mit Schwimmern als Schlüssel ein 'HashMap' verwenden. – Jack

+0

@Jack ist das, weil die Floats nicht genau genug sind und zwei ähnliche Werte den gleichen Hash-Wert geben können? – Lucas

+0

Bitte definieren "am ähnlichsten" –

Antwort

8

Klingt wie ein Job für eine der Implementierungen von java.util.NavigableMap.

+0

+1 es ist so wertvoll, wenn die Leute antworten mit weniger verwendeten Dienstprogramme der Sprachen – kommradHomer

+1

Gute Antwort, könnte man dann 'deckeKey (K-Taste)' und 'floorKey (K-Taste) 'um die zwei am nächsten liegenden Schlüssel zu bestimmen und zu berechnen, welcher näher ist. –

+0

hört sich gut an. Ich arbeite mit Android SDK 2.1 ,, aber kann diese Schnittstelle nicht finden -.- –

1

Floats als Schlüssel in einer HashMap zu verwenden ist eine sehr schlechte Idee!

+0

Warum ist das eine schlechte Idee? –

+0

float ist kein integraler Wert. Sie müssen mit nicht offensichtlichen Berechnungsunterschieden umgehen. kleiner Unterschied im letzten Bit verursacht einen anderen Schlüssel und daher Ergebnis –

0

Ich denke, Sie sind besser mit einem einfachen Array/ArrayList mit Einträgen nach dem Schlüssel sortiert und führen Collections.binarySearch(). Wenn der Eintrag nicht gefunden wird, gibt er den nächsten Nachbarn zurück.

0

Der einfachste Weg

HashMap<Float, String> map = new HashMap<Float, String>(); 

    Float newFloat = 123F; 

    Float minDif = null; 
    Float findedValue = null; 

    for (Float key : map.keySet()) { 
     Float dif = Math.abs(key - newFloat); 
     if (minDif != null) { 
      if (dif < minDif) { 
       minDif = dif; 
       findedValue = key; 
      } 
     } else { 
      minDif = dif; 
      findedValue = key; 
     } 
    } 
Verwandte Themen