2016-04-13 18 views
0
private static final HashMap<StringFirstFourSymbolsHashCode, Product> FIRST_FOUR_SYMBOLS_HASH_CODE_PRODUCT_HASH_MAP = new HashMap<StringFirstFourSymbolsHashCode, Product>() {{ 
     put(new StringFirstFourSymbolsHashCode("121"), new Product("prod1", "100500")); 
     put(new StringFirstFourSymbolsHashCode("45631232"), new Product("prod2", "400500")); 
     put(new StringFirstFourSymbolsHashCode("6442112"), new Product("prod3", "20500")); 
     put(new StringFirstFourSymbolsHashCode("4562121"), new Product("prod4", "22500")); 
     put(new StringFirstFourSymbolsHashCode("4321"), new Product("prod5", "1020")); 
    }}; 

StringFirstFourSymbolHashCode overrided MethodenJava HashMap Key Verwirrende

@Override 
public int hashCode() { 
    int hashCode = 0; 
    for(Character character : string.toCharArray()){ 
     hashCode += character; 
    } 
    return hashCode; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (!(obj instanceof StringFirstFourSymbolsHashCode)) { 
     return false; 
    } 
    StringFirstFourSymbolsHashCode stringFirstFourSymbolsHashCode = (StringFirstFourSymbolsHashCode)obj; 
    return string.equals(stringFirstFourSymbolsHashCode.string); 
} 

Als ich Elemente aus HashMap sie outs sehr seltsam. Wie ich HashMap die Schlüssel bestellt durch Erhöhung sehen, aber warum nach 410 outs 202

> StringHashCodeLength HasMap Iterator 
> StringFirstFourSymbolsHashCode{string='121, 
> hashCode=148}=Product:name='prod1, cost='100500} 
> StringFirstFourSymbolsHashCode{string='6442112, 
> hashCode=356}=Product:name='prod3, cost='20500} 
> StringFirstFourSymbolsHashCode{string='4562121, 
> hashCode=357}=Product:name='prod4, cost='22500} 
> StringFirstFourSymbolsHashCode{string='45631232, 
> hashCode=410}=Product:name='prod2, cost='400500} 
> StringFirstFourSymbolsHashCode{string='4321, 
> hashCode=202}=Product:name='prod5, cost='1020} 

bitte erklären, wie es

+5

'HashMap' definiert überhaupt keine Sortierung. Wenn Sie Einträge in der Reihenfolge ihrer Eingabe benötigen, verwenden Sie stattdessen ['LinkedHashMap'] (https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html). Wenn Sie Einträge nach Schlüsselwert geordnet zurückgeben möchten, verwenden Sie eine der Implementierungen von "SortedMap" (https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html). –

+0

http://stackoverflow.com/questions/30671239/why-are-elements-in-hashset-in-random-order – AdamSkywalker

+0

Sie können warten, Einträge von Hash-Code bestellt werden, aber das passiert nicht: 1) wenn Hash-Tabelle klein ist, können Einträge von mehreren Hashcodes in demselben Bucket platziert werden; 2) um zu entscheiden, welche bestimmte Zelle ein Eintrag in der Hashtabelle belegen soll, wird eine zusätzliche Berechnung auf Hashcode durchgeführt (z. B. "Zelle = Hash% 8", wenn die Tabellengröße 8 ist) –

Antwort

0

versuchen die folgende

private static final SortedMap<StringFirstFourSymbolsHashCode, Product> FIRST_FOUR_SYMBOLS_HASH_CODE_PRODUCT_HASH_MAP = 
new SortedMap<StringFirstFourSymbolsHashCode, Product>() 

arbeitet einfach mit SortedMap ändern HashMap.