【问题标题】:2D Array in Java, Indexed by CharactersJava中的二维数组,按字符索引
【发布时间】:2011-02-26 05:05:48
【问题描述】:

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

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

有没有办法让它工作?

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

【问题讨论】:

  • 使用地图不是更有效吗?无论如何,您基本上都在使用地图 - 使用字符的哈希值来索引您的数组。
  • 也许吧。那么,在 Java 中创建一对键的最简单方法是什么(因为没有原生元组,就像在 Python 中一样)?

标签: java arrays multidimensional-array


【解决方案1】:

这不是非法的,因为在 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 和

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,但应该提到总空间要求(2 * 2^16 * 2^16 = 2^33 = ^^)。最初的问题听起来好像只应该使用给定范围内的字符 [0,255) - 所以也许也可以解决这个问题。
【解决方案2】:

字符等价于无符号的 16 位整数,但这在 Java 中确实是一个可怕的设计缺陷,不应该被滥用。从概念上讲,char 类型代表一个字符,而不是恰好映射到字符的整数值(或者在代理对的情况下甚至映射到字符的一部分)。

Map 接口应该用于将某物映射到某物。仅当索引类型是成熟的整数类型时才应使用数组,这意味着要照此使用。而当这些索引不适合一个固定的区间,所以你事先不知道数组的大小时,最好也使用 Map 来映射整数,而不是每次都调整数组的大小。

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

【讨论】:

    【解决方案3】:

    这行得通(我的意思是它可以编译):

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

    错误:

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

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 2012-02-24
        • 2017-08-16
        • 2013-10-10
        • 1970-01-01
        • 2023-03-07
        相关资源
        最近更新 更多