为什么我们在charAt(i)旁边使用-'0'?

8
我读了《Hello Android》这本书,但我不理解其中的一个函数。在charAt(i)后面为什么要加上-'0'?
static protected int[] fromPuzzleString(String string) {
    int[] puz = new int[string.length()];
    for (int i = 0; i < puz.length; i++) {
        puz[i] = string.charAt(i) - '0' ;
    }
    return puz; 
 }

谢谢你。 干杯。

5个回答

9

由于string.charAt(i)返回的是char。但puzint[]

所以string.charAt(i) - '0'将其转换为整数。


请注意,这是糟糕的代码。它有点神秘,只能使用ASCII,并且更难以进行心理解析。最好使用Integer.parseInt() - Chinmay Kanchi
2
Integer.parseInt() 需要一个 String,而不是一个 char - Petar Minchev
@ChinmayKanchi 这样行不通。Integer.parseInt() 接收的是一个 String,但是 string.charAt(i) 返回的是一个 char - Óscar López
@ChinmayKanchi 是的,它只是ASCII,但请记住,代码本身是一个非常常见的模式,有几十年的历史;自从ASCII和字符以来,我们一直在使用它。对于我们这些老人来说,它读起来相当自然。 - Dave Newton
@oscar @petar 使用Integer.parseInt()和其中一个子字符串方法。这不是什么高深的科学。@Dave 对我来说也很自然。尤其是在像Java这样的“现代”语言中,这仍然是一种可怕的黑客行为。 - Chinmay Kanchi
@petar 我已经给你的答案点赞了。问题中的代码质量不好并不是你的错。 ;) - Chinmay Kanchi

4
你想要做的是逐个读取字符,将其转换为整数并存储在数组中。
0的ASCII代码为48。因此实际上你需要做的是从特定位置处的char的ASCII值中减去此值,然后将数字结果存储在相应的索引中。
如果你尝试在循环中打印它,你可以自己验证一下,例如:
System.out.println((int)string.charAt(i));
System.out.println((int)'0');

2
@PeterLawrey:谢谢!有时候我觉得我想太多了 :( - Sujay

2

1
该字符串是一个数字。此代码将把字符串转换为整数数组。
string.charAt(i) 将返回一个字符,string.charAt(i)- '0' 将返回实际的整数值。
例如,当 string="12345" 时,此方法将返回一个整数数组 [1,2,3,4,5]。

0

我不知道这个特定操作的目的是什么,但在Java(以及许多编程语言中),字符(char)被表示为整数值(在Java中只有较小的2字节)。您可以像这样显式地将字符转换为整数:

int x = (int) 'a';

我认为这段代码做了类似的事情。 String.charAt() 函数返回一个 char,如果您像处理 int 一样处理它,则其值为120(仅为示例)。 '0'(作为 char)也有一个值。 如果您将它们相减,就可以得到一个整数值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接