Java中的2D数组,由字符索引

除非我弄错了,否则在Java中使用字符值索引数组是合法的,因为这些数组相当于8位数。 但是,以下代码为我生成错误消息:

int[][] myArray = new int[256][256]; myArray['%']['^'] = 25; 

有没有办法让这项工作?

编辑 :哇,我真的没有做好复制代码的工作。

这不是非法的,因为在Java(和其他语言)中,这种情况下的char将被转换为int。 如(int)'%'

如果您不知道它将是什么类型的char值,那么这样的东西会更安全。

 int[][] myArray = new int[Character.MAX_VALUE][Character.MAX_VALUE]; myArray['%']['^'] = 24; 

它将起作用,因为Java将其转换为:

 myArray[37][94] = 24; 

确保放置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品 ?

编辑

自更改代码后更改了类型。

字符等同于无符号的16位整数,但这在Java中确实是一个非常糟糕的设计缺陷,不应该被滥用。 从概念上讲, char类型代表一个字符,而不是映射到一个字符的某个整数值(如果是代理对,则代表一个字符的一部分)。

应该使用Map接口将某些东西映射到某个东西。 仅当索引类型是完整的整数类型时才应使用数组,这意味着要使用它。 当这些索引不适合固定的间隔时,所以你事先不知道数组大小,最好使用Map映射整数,而不是每次调整数组的大小。

还考虑内存使用情况。 对于8位字符(ASCII),您可以使用256x256x4 = 256K字节的内存。 但是你杀死了以这种方式国际化你的应用程序的可能性,这是一个严重的犯罪。 要支持整个16位范围,您需要64Kx64Kx4 = 16G字节! 并且你仍然不会完全支持该范围之外的角色,但是你也不会再使用Map,这是Java的缺陷,而不是你的。 不过,并不是很多人都需要它。

这有效(我的意思是它编译):

 int[][] myArray = new int[256][256]; myArray['%']['^'] = 10; 

错误:

  1. 你有不同的数组名称:第一个是myArray ,第二个是名为table
  2. myArray是一个int数组数组,但是您为该单元格分配了一个字符串。

作为参考 ,Java char是16位无符号数量,它是有效的数组索引 ,并且“字符数组不是字符串”