【问题标题】:java character converting into number in 2D char arrayjava字符转换为二维字符数组中的数字
【发布时间】:2014-03-29 18:06:24
【问题描述】:

我正在尝试将 2D 字符数组中的所有字母转换为数字。结果,我想要 a = 0, b=1, c=2, ... z=25。

然后,我尝试将此作为我的代码的一部分:

char [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}};

for (int i = 0; i < letters.length; i++) {
            for (int j = 0; j < letters[i].length; j++) {
                if (letters[i][j] >= 'a' && letters[i][j] <= 'z') {
                   letters[i][j] = (char) ((letters[i][j] - 'a') + '0');
                } 
            }
        }

我的代码结果不是我之前所期望的。

从“a”到“j”,效果很好。但是,从 'k' 到 'z' 它没有打印出预期的数字。

我的代码有什么问题?

【问题讨论】:

  • 请显示字母的声明及其填充方式。
  • 请解释一下为什么要进行字符运算:((letters[i][j] - 'a') + '0')
  • 那么您的问题是您正在从字符创建 ascii 数字符号。 ascii 表没有 10 或更高的数字。所以当你得到 10 号时,结果可能是:

标签: java multidimensional-array


【解决方案1】:

首先,您不能将数字 10 存储为单个字符。它是两个字符,1 和 0。所以结果数组必须是 char 数组以外的东西。如果您使用的是int,那么您最好将它们存储在一个 int 数组中。

intarray[i][j] = (letters[i][j] - 'a'); 其中 intarray 是您的 int 值数组,其大小与 char 数组相同。如果您必须将结果存储在同一个数组中并将其转换为数字然后再转换为字符串,则另一种选择是创建一个字符串数组。像这样

String [][] letters = {{"i", "u"}, {"a", "g"}, {"e", "k"}};

for (int i = 0; i < letters.length; i++) {
    for (int j = 0; j < letters[i].length; j++) {
        if (letters[i][j].charAt(0) >= 'a' && letters[i][j].charAt(0) <= 'z') {
           letters[i][j] = Integer.toString((letters[i][j].charAt(0) - 'a');
        } 
    }
}

原因是 ascii 表只有数字 0 到 9 作为符号。因此,在您的情况下,您将获得前 10 个要转换的字母,但之后您开始在 ascii 表中获得各种符号。 k 例如是 :, l 是 ; m 是

您可以在不将其转换为 int 的情况下执行相同的操作,但这意味着您需要找出 char - 'a' 大于 10。如果是这样,您需要将数字除以 10,然后再取模编号并为它们中的每一个赋予相关的 ascii 符号以将它们变成一个字符串。这要复杂得多,而且很难做到,特别是考虑到仅使用 int 来做到这一点是多么容易。

您还有其他 2 个选项,但我仍然觉得上面的字符串选项是迄今为止最简单的。

首先是将二维数组作为一个整数。然后,您可以将整数初始化为字母。然后你可以对它们进行算术运算以找到它们适合的数字。像这样:

int [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}};

for (int i = 0; i < letters.length; i++) {
   for (int j = 0; j < letters[i].length; j++) {
        if (letters[i][j] >= 'a' && letters[i][j] <= 'z') {
            letters[i][j] = (letters[i][j] - 'a');
        } 
    }
}

这将具有相同的效果。这样做的问题是打印实际字母需要更多的努力,最后您需要将其转换为字符。所以我不推荐这种方式。

第二种选择是将所有内容作为 char 值存储在 char 数组中。像这样:

char [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}};

for (int i = 0; i < letters.length; i++) {
    for (int j = 0; j < letters[i].length; j++) {
        if (letters[i][j] >= 'a' && letters[i][j] <= 'z') {
            letters[i][j] = (char) (letters[i][j] - 'a');
        } 
    }
}

要打印它,您需要将 char 转换为 int。所以你可以打印它们:

for (int i = 0; i < letters.length; i++) {
    for (int j = 0; j < letters[i].length; j++) {
        System.out.printf("%d\n", (int) letters[i][j]);
    }
}

这也可以工作,但它有点hacky,你需要确保你一直将你必须的char转换为int。到目前为止,我认为字符串数组是最好的选择,但这取决于你的目标是什么。但是您不能做的一件事是将字符“10”存储在字符数组中,因为“10”不是单个字符而是 2 个字符,并且不适合一个字符。

【讨论】:

  • 你介意解释一下 OP 的路线,假设它是有道理的吗? letters[i][j] = (char) ((letters[i][j] - 'a') + '0'); 字符算术是我不熟悉的东西。它是否打算作为连接?
  • 嗯,对于字母 a 到 j(前 10 个字母)来说确实有意义。 @aliteralmind 原因是 Char 'a' - 'a' + '0' 在 ascii 表中为我们提供了 97 - 97 + 48 。 Ascii 符号 48 为 0。因此结果将是字符“0”。但是 k 是 107,所以公式是 107-97+48,这给了我们 58,它是 ascii 表中的符号 58 或 :.
  • 感谢您的澄清。不完全清楚,但我明白了。
  • @alliteralmind 我可以尝试详细说明它作为基本概念。每个 char 基本上都是一个 int。然后 int 表示 ascii 表 (asciitable.com) 中的一个符号。因此,如果我创建一个字符“a”,它可以被视为数字 97。与字母“A”相同(大写字母 A 与 a 的符号不同)。因此,'A' 是 65。这意味着我们可以对字符进行数学运算,如果我们读取结果,则结果会在 ascii 表中为我们提供另一个字符。 'b' - 1 将等于表格中的 'a',因为 a 在表格中的 b 后面为 1。
  • @Speaky int [][] numLets = new int[lets.length][lets.length];应该是 int [][] numLets = new int[lets.length][lets[0].length];因为lets.length与lets中的内部数组长度不同。
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多