Java中的字符串到整数解决方案



我在Java中找到了Stringint转换的解决方案(来源:"Java中编程访谈的元素">(。有人能告诉我发生了什么事吗?

public static int stringToInt(String s){
return (s.charAt(0) == '-' ? -1 : 1) * s.substring(s.charAt(0) == '-' ? 1 :0)
.chars()
.reduce(0, (runningSum,c) -> runningSum * 10 + c -'0');
}

我理解第一部分,他们检查String是否以"-"开头,如果是,他们将结果乘以-1,只取不带"-"的子字符串。那怎么办?他们为什么使用.chars()?在第三行也是最后一行,我甚至不懂语法。一步一步的输出将是值得赞赏的。

他们为什么使用.chars((

因为如果你想手动将String转换为int,你需要访问每个字符。每个字符都包含一个数字,所以你需要访问每一个字符。String.chars()返回字符串中的一个字符流。

在第三行也是最后一行,我甚至不懂语法

让我们把它分解一下,然后:

Stream.reduce()将流内的值缩减为一个值,使用0作为标识值,使用lambda表达式(runningSum,c) -> runningSum * 10 + c -'0'作为累加器

lambda表达式(runningSum,c) -> runningSum * 10 + c -'0'被Java编译器转换为BinaryOperator实例。这个特定的实例接受两个int参数,并将返回一个int结果。你可以想象它看起来像这样:

class CompilerGeneratedBinaryOperator implements BinaryOperator<int> {
public int apply(int runningSum, int c) {
return runningSum * 10 + c -'0';
}
}

reduce方法将在String中所有字符的循环中调用此方法,始终使用最后一个结果作为下一个runningSum参数(以及第一次调用中的identity0(。

现在让我们看看lambda:runningSum * 10 + c -'0'中的语句。

这里发生的是,它利用了每个字符的ASCII码。它基本上假设它有一个表示有效整数的String,即所有字符都在'0''9'内。如果查找ASCII表,您会注意到数字字符的整数表示为4857。因此,'0'等于48,这意味着当字符c'0'时,其值为48,而c - '0'将为48 - 48,即0。如果c'1',则'1' - '0'将是1,依此类推。基本上,c - '0'给出与字符所代表的数字相对应的整数值。

剩下的很简单。它将把最后一个结果乘以10,然后加上当前数字,正如Michael的回答所说:

Step 1. 0
Step 2. (0 * 10) + 1 == 1
Step 3. (1 * 10) + 2 == 12
Step 4. (12 * 10) + 3 == 123

这是流语法。string.chars((.reduce(…(大致相当于

int runningSum = 0;
for (int i = string.length() - 1; i >= 0; i ++){
runningSum *= 10;
runningSum += string.charAt(i) - '0';
}

您可以在此处阅读更多信息:http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

他们所做的是从初始和0开始,然后,对于从最左边开始的每个字符,将当前和乘以10,并添加当前字符的数值:

例如,"123":

Step 1. 0
Step 2. (0 * 10) + 1 == 1
Step 3. (1 * 10) + 2 == 12
Step 4. (12 * 10) + 3 == 123

在给定累加器的情况下,reduce方法对流进行操作以产生某种类型的T(在本例中为int(的单个值
在这种情况下,累加器被提供为lambda表达式(runningSum,c) -> runningSum * 10 + c -'0'(遵循形式(arguments) -> expression(

chars方法仅用于从'-'之后的字符串部分获得流,您需要该部分才能使用reduce

减法CCD_ 43用于将字符转换为相应的数值。如果从'0'中减去'0',则得到0;如果从'1'中减去'0',则得到1,依此类推

对于第一部分,如果存在"-",则乘以-1,然后取字符串的另一部分(例如,对于"-25",则为"25"(。

然后将其转换为带有".chars"的char数组(实际上是IntStream,但它大致等于char数组(。

然后,用reduce取每个数字,reduce获取数组中的每个字符并应用lambda(奇怪的"->"表示法(。

您从每个字符中删除"0"以获得int值("0"的ASCII代码为48(,将实际和乘以10,然后将当前字符的值相加。以-420为例,你有:

  • 1(减号(=>乘以-1(
  • 2( char数组[52,50,48](因为ASCII表中的char'4'是52,'2'是50…(
  • 3( 减少:
    • 3.1(52-48=4
    • 3.2(4*10+(50-48(=40+2=42
    • 3.3(40*10+2*10+(48-48(=400+20+0=420
    • 3.4(将解乘以-1=-420(来自步骤1(

注意:很抱歉我英语不好,如果你听不懂我说的话,可以问

相关内容

最新更新