2016-11-21 73 views
0

我有一个哈希映射,似乎正在改变我存储在其中的值。几乎所有的密钥都映射正确;然而,entrySet()中有大约4或5个键的值完全不同于实际放入其中的值。我完全丧失了。为什么我的哈希映射中的值与放入的值不同?

public static void main(String args[]){ 
    HashMap<Character, Integer> map = make_map(); 
    System.out.print(map.entrySet()); 

} 

public static HashMap<Character,Integer> make_map(){ 
    HashMap<Character, Integer> map = new HashMap<>(); 


    map.put('a',100000); 
    map.put('b',110000); 
    map.put('c',100100); 
    map.put('d',100110); 
    map.put('e',100010); 

    map.put('f',110100); 
    map.put('g',110110); 
    map.put('h',110010); 
    map.put('i',010100); 
    map.put('j',010110); 

    map.put('k',101000); 
    map.put('l',111000); 
    map.put('m',101100); 
    map.put('n',101110); 
    map.put('o',101010); 

    map.put('p',111100); 
    map.put('q',111110); 
    map.put('r',111010); 
    map.put('s',011100); 
    map.put('t',011110); 

    map.put('u',101001); 
    map.put('v',111001); 
    map.put('w',010111); 
    map.put('x',101101); 

    map.put('y',101111); 
    map.put('z',101011); 
    map.put(' ',000000); 



    return map; 

} 

我注意到我的几个条件没有出于某种原因,然后当我打印出来的entrySet()我发现像钥匙“我”都被映射到4160,即使我明确提出010100。另外,'j'也给了我一个4160的虚假结果。其他人都很好......然后再次字符“W”和其他几个人被映射到与4

开始这里的整个条目集4个数字:

[ =0, a=100000, b=110000, c=100100, d=100110, e=100010, f=110100, g=110110, h=110010, i=4160, j=4168, k=101000, l=111000, m=101100, n=101110, o=101010, p=111100, q=111110, r=111010, s=4672, t=4680, u=101001, v=111001, w=4169, x=101101, y=101111, z=101011] 

,你可以看到't'和's'不像其他前面提到的那样。这是怎么回事?

+3

从0开始的数字文字被解析为八进制数字(基数8)。也许你应该使用'HashMap '。 – Eran

+1

重复说明*为什么*结果会以这种方式出现,但实际上并没有提供任何解决方法来解决此问题。 – Makoto

回答

2

正如你已经发现,有在整数前放置一个前导零的问题; Java会将其视为一个八进制数字,它是基数为8的数字。

这是第一个的问题。你放在那里的数字是而不是 base-2就像你想的那样,但他们 base-8。

这很容易解决;您只需确保将数字放入地图时将数字解析为二进制。

map.put('a', Integer.parseInt("100000", 2)); 

打印这些数字会给你充分的整数表示。这是第二个的问题;除了标准数值型表示之外,打印出集合不会以任何其他形式翻译或格式化数据。

如果要将它们打印为十六进制值,则需要使用Integer.toBinaryString

这也很容易用Java 8的Stream API完成。

map.entrySet().forEach((entry) -> System.out.printf("%s=%s ", entry.getKey(), Integer.toBinaryString(entry.getValue()))); 
1

你看这个结果,因为你的价值观开始0,并表示为八进制数字,基地8