String.chars()-为什么在这里使用“ i-'0'”? [重复]

问题描述 投票:0回答:1

我解决了代码战的任务,看起来像这样:

写一个具有正参数num的函数,持久性并返回其乘法持久性,即您必须将num中的数字相乘,直到达到单个数字。

例如:

 persistence(39) == 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
                      // and 4 has only one digit

 persistence(999) == 4 // because 9*9*9 = 729, 7*2*9 = 126,
                       // 1*2*6 = 12, and finally 1*2 = 2

 persistence(4) == 0 // because 4 is already a one-digit number

解决此问题后,我找到了其他解决方案:

  class Persist {
    public static int persistence(long n) {
        int times = 0;
        while (n >= 10) {
            n = Long.toString(n).chars().reduce(1, (r, i) -> r * (i - '0'));
            times++;
        }
        return times;
    }
 }

它正在工作,但是为什么我们必须做:-reduce中的'0'?

java stream
1个回答
1
投票

i - '0'是将ASCII(或类似)数字的值转换为实际数字的常见技巧。例如,'5'的编码实际上不是5,而是其他一些值(我认为是53或ASCII中的某个值)。但是在大多数系统中,'5'的编码比'0'的编码大5倍。因此,从字符“ 5”的编码中减去'0'的值(字符“ 0”的编码)将得到数值为5。


2
投票

通常,这是一种将代表数字(如char)的int(或类似您的代码位char ch = '3';,如带有代码点的代码)转换为int的方法,该数字将持有与该数字对应的数字(此处为int num = 3; )。


char类型的变量实际上不保存字符的图形表示,但是它保存与Unicode表中该字符的位置/索引对应的数字。例如,小写字母"a"被放置在索引97处,并且该值"a"将保留在其16个字节中(因为这是char ch = 'a';类型的大小)。

由于[char包含数字,我们被允许使用对数字进行运算的运算符,例如char+。这意味着我们可以编写类似于-的代码,该代码将作为'b' - 'a'执行并得到整数97 - 96。我们也可以使用1int - char,因为这两种格式都将转换为char - intint - int将转换为char)并返回int,它表示这些字符之间的距离

这是int背后的主要思想。

我们知道在Unicode表中将数字放置在某处(我们不希望确切地知道位置)的顺序是... 0 1 2 3 4 5 6 7 8 9 ....(还有他们之间没有字符)。

这使我们可以确定

  • i - '0'将返回0,
  • '9' - '9'将返回1,
  • '9' - '8'将返回2,
  • ...
  • '9' - '7'将返回9,
  • '9' - '0'将返回8,
  • '8' - '0'将返回7,
  • ...
  • '7' - '0'将返回1,
  • '1' - '0'将返回0。

简而言之,'0' - '0'给我们indexOfNumberN - indexOfZero的值为int


为了避免此类混乱的代码,您可以将lambda重写为更具可读性的形式

NumberN

© www.soinside.com 2019 - 2024. All rights reserved.