我有一个哈希映射,似乎正在改变我存储在其中的值。几乎所有的键都映射正确;但是,大约有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'与前面提到的其他内容不同。发生了什么事?
答案 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。