Java String.chars()-为什么;i-';0'&引用;这里用什么?
我解决了codewars上的任务,如下所示: 编写一个函数persistence,它接受一个正参数num 并返回其乘法持久性,即 您必须将num中的数字相乘,直到达到一个整数 数字 例如: 解决这个问题后,我找到了另一个解决方案:Java String.chars()-为什么;i-';0'&引用;这里用什么?,java,java-stream,Java,Java Stream,我解决了codewars上的任务,如下所示: 编写一个函数persistence,它接受一个正参数num 并返回其乘法持久性,即 您必须将num中的数字相乘,直到达到一个整数 数字 例如: 解决这个问题后,我找到了另一个解决方案: class Persist { public static int persistence(long n) { int times = 0; while (n >= 10) { n = Long
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;
}
}
这是可行的,但为什么我们必须这样做:——“0”在reduce中?i-“0”是将ASCII(或类似)数字的值转换为实际数字的常见方法。例如,
'5'
的编码实际上不是5
,而是其他一些值(我认为是53或ASCII码)。但是在大多数系统中,'5'
的编码比'0'
的编码大5。因此,从字符“5”的编码中减去'0'
(字符“0”的编码)的值将得到一个5的数值。i-'0'
是将ASCII(或类似)数字的值转换为实际数字的常见方法。例如,'5'
的编码实际上不是5
,而是其他一些值(我认为是53或ASCII码)。但是在大多数系统中,'5'
的编码比'0'
的编码大5。因此,从字符“5”的编码中减去'0'
(字符“0”的编码)的值将得到一个5的数值。通常这是一种转换表示数字的char
(或者像在你的例子中int
,它包含码点)的方法(比如char ch='3';
)进入int
,其中将保存与该数字对应的数字(此处int num=3;
)
类型为
char
的变量实际上并不包含字符的图形表示,但它包含对应于该字符在Unicode表中的位置/索引的数字。例如,将小写字母放在索引97处,即值char ch='a'
将保存在其16个字节中(因为这是char
type的大小)
由于字符
包含一个数字,我们可以使用对数字起作用的运算符,如+
和-
。这意味着我们可以编写像'b'-'a'
这样的代码,它将作为97-96
执行,结果是整数1
。我们还可以使用int-char
或char-int
,因为这两种形式都将转换为int-int
(char
将转换为int
),并返回int
,它表示这些字符之间的距离
这就是i-'0'
背后的主要思想。
我们知道在Unicode表中,数字被放置在某个地方(我们不知道确切的位置),以便。。。0 1 2 3 4 5 6 7 8 9 .... (它们之间没有字符)
这使我们确信
将返回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
值为NumberN
为了避免这种混乱的代码,您可以将lambda重写为更可读的形式
(r,i)->r*Character.getNumericValue(i)
通常,这是一种将表示数字(如char ch='3';
)的char
转换为int
的方法,后者将保存与该数字对应的数字(此处int num=3;
)
类型为
char
的变量实际上并不包含字符的图形表示,但它包含对应于该字符在Unicode表中的位置/索引的数字。例如,将小写字母放在索引97处,即值char ch='a'
将保存在其16个字节中(因为这是char
type的大小)
由于字符
包含一个数字,我们可以使用对数字起作用的运算符,如+
和-
。这意味着我们可以编写像'b'-'a'
这样的代码,它将作为97-96
执行,结果是整数1
。我们还可以使用int-char
或char-int
,因为这两种形式都将转换为int-int
(char
将转换为int
),并返回int
,它表示这些字符之间的距离
这就是i-'0'
背后的主要思想。
我们知道在Unicode表中,数字被放置在某个地方(我们不知道确切的位置),以便。。。0 1 2 3 4 5 6 7 8 9 .... (它们之间没有字符)
这使我们确信
将返回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
值为NumberN
为了避免这种混乱的代码,您可以将lambda重写为更可读的形式
(r,i)->r*字符。getNumericValue(i)
获取实际整数值。如果不是,则获得的ASCII等效值为
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;
}
}