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

时间:2011-02-26 05:05:49

标签: java arrays multidimensional-array

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

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

有没有办法让这项工作?

编辑:哇,我真的没有很好地复制代码。

4 个答案:

答案 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;

错误:

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

答案 3 :(得分:0)