有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java的chars()流如何与reduce一起工作?它使用字符编码吗?

在代码战中,计算一个Long的各个整数相乘多少次才能变成一个位数是一个挑战。比如

39->;3*9=27->;2*7=14->;1*4=4//答案是3

以下是发布的解决方案之一-

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;
  }
}

我对代码中的“(I-‘0’)部分感到非常困惑。我昨天刚刚了解到,Java的chars()方法返回一个IntStream,它表示字符,因此立即使用reduce对我来说是有意义的。但是它减去了一个字符,这让我很反感,因为它似乎适用于字符,但是它们是如何相乘的呢

我复制了上面的代码,然后删除了字符减法,这是我理解的一个简单的reduce语句,也就是

n = Long.toString(n).chars().reduce(1, (r, i) -> r * i);

然后运行调试器。第一个循环计算出3*9为2907。这个答案来自哪里?我最好的猜测是它与字符编码有关,但为什么减去字符“0”可以解决这个问题呢


共 (1) 个答案

  1. # 1 楼答案

    Achar只是^{}^{}范围内的一个数字,在打印或连接到字符串时具有特殊意义

    你写起来很容易

    int i = 'A';
    

    而且

    char c = 65;
    

    两个变量都指向同一个数字,因此

    System.out.println(i == c);
    

    将打印true但当您执行

    System.out.println(i);
    System.out.println(c);
    

    不同的变量类型将导致选择不同的方法,并对值进行不同的解释

    您可以使用char值进行计算,并始终将它们分配给int变量,因为它们的值范围适合int值范围,因此可以使用IntStream处理char值序列,并保存另一个专用流类的创建。您只需注意正确解释结果值

    说到编码,char被定义为UTF-16单元,所以如果你想给它起个名字,那就是正确的

    对于你问题的例子,关键是要知道字符'0''9'在UTF-16编码中有相邻的值(它适用于所有Unicode编码),所以不仅从'0'减去'0'得到int0,从'0''9'范围内的任何字符中减去'0'将得到相应的int值。'0'的编码值为48这一事实甚至与此逻辑无关

    请注意^{}方法的存在,它返回^{cd2>}到^{} (^{})范围内的Unicode code point值序列。对于BMP中的字符,值与char值相同,但BMP之外的值被编码为两个UTF-16单元,因此更容易用codepoints()流处理它们