除非我弄错了,否则在Java中使用字符值索引数组是合法的,因为它们相当于8位数字。但是,以下代码为我生成错误消息:
int[][] myArray = new int[256][256];
myArray['%']['^'] = 25;
有没有办法让这项工作?
编辑:哇,我真的没有很好地复制代码。
答案 0 :(得分:2)
这不是非法的,因为在Java(和其他语言)中,这种情况下的char将被转换为int。例如(int)'%'
如果你不知道它会是什么类型的char值,这样的东西会更安全。
int[][] myArray = new int[Character.MAX_VALUE][Character.MAX_VALUE];
myArray['%']['^'] = 24;
它将起作用,因为Java会将其转换为:
myArray[37][94] = 24;
确保放置max value的char(已经完成),基本上是'?'转换为65535.或者你将获得ArrayOutOfBoundsException。
如果你知道你的范围,你仍然可以使用256.只要确保你做了正确的边界检查输入是> = 0和< 256。
public int getItem(int x, int y) {
if ((x < 0 && x > 255) || (y < 0 && y > 255)) {
return -1; // Or you can throw an exception such as InvalidParameterException
}
return myArray[x, y];
}
错误边界检查对此起着重要作用。
我会重新考虑你想做什么,这样的事情是不可读的,你想要实现什么?也许你可以使用不同的collections?
编辑
自更改代码后更改了类型。
答案 1 :(得分:1)
字符相当于无符号的16位整数,但这在Java中确实是一个非常糟糕的设计缺陷,不应该被滥用。从概念上讲,char
类型代表一个字符,而不是映射到一个字符的某个整数值(如果是代理对,则代表一个字符的一部分)。
Map接口应该用来映射某些东西。仅当索引类型是完整的整数类型时才应使用数组,这意味着要使用它。当这些索引不适合固定的时间间隔时,所以你事先不知道数组的大小,最好使用Map来映射整数,而不是每次调整数组的大小。
还要考虑内存使用情况。对于8位字符(ASCII),您可以使用256x256x4 = 256K字节的内存。但是你杀死了以这种方式国际化你的应用程序的可能性,这是一个严重的犯罪。要支持整个16位范围,您需要64Kx64Kx4 = 16G字节!并且你仍然不会完全支持该范围之外的角色,但是你也不会再使用Map,这是Java的缺陷,而不是你的。不过,并不是很多人都需要它。
答案 2 :(得分:0)
这有效(我的意思是它编译):
int[][] myArray = new int[256][256];
myArray['%']['^'] = 10;
错误:
myArray
,第二个名为table
int
数组的数组,但是您为该单元格指定了一个字符串。 答案 3 :(得分:0)