为什么我的哈希映射中的值与放入的值不同?

时间:2016-11-21 07:26:54

标签: java hashmap

我有一个哈希映射,似乎正在改变我存储在其中的值。几乎所有的键都映射正确;但是,大约有4或5个键的值在entrySet()中完全不同于实际放在它们内部的值。我完全失去了。

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()时,我注意到像'i'的键被映射到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'与前面提到的其他内容不同。发生了什么事?

2 个答案:

答案 0 :(得分:2)

正如您所发现的那样,将一个前导零置于整数前面存在问题; Java会将其视为八进制数,即base-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 :(得分:1)

您会看到此结果,因为您的值以intent.putExtra("uri", Uri); 开头并表示为八进制数字,基数为8。