首页 > 解决方案 > 如何更改字符串中的数字?

问题描述

我需要将每个数字替换为给定字符串s中 9 的补码

示例:我有235美元!-> 我有 $(9- 2 )(9- 3 )(9- 5 )!-> 我有 764 美元!

public static void playPass(String s, int shift) {
        s.chars().map(i -> Character.isDigit(i) ? ____________?___________ : i)
                .mapToObj(i -> (char) i).forEach(System.out::println);
}

是的,当然,我可以通过使用 for 循环来解决它,但我只是想了解更多关于 Streams 的信息。

所以我尝试过:

  1. .map(i -> Character.isDigit(i) ? 9-i : i) 输出:“我有 $ᅲᅱᅯ!”。这是因为 char 和用整数表示它之间的差异。

  2. .map(i -> Character.isDigit(i) ? Character.getNumericValue(9-i) : i) 输出:“我有 $???!”。但是在这里我知道 i - 不是一个真正的值,它只是 ASCII 码。

  3. .map(i -> Character.isDigit(i) ? Character.getNumericValue(9-Integer.parseInt(String.valueOf(i))) : i) 输出:“我有美元???!”

我想第三次尝试更聪明,但它不起作用(

我需要一些像这样工作的方法(convertDigitCharToInt)(更改字符)

i - char

i = Character.getNumericValue(9-convertDigitCharToInt(i));

这不是家庭作业))我只是在 codewars.com 练习。于是就有了这样的问题。[链接]:https ://codewars.com/kata/559536379512a64472000053/train/java )

标签: javalambdacharjava-stream

解决方案


你几乎做到了。补码计算为字符'9'与当前字符数字之间的差加上移位'0'以获得新字符。

以下代码工作正常:

public static void playPass(String s) {
        s.chars()
            .map(i -> Character.isDigit(i) ? '9' - i + '0' : i)
            .mapToObj(i -> (char) i)
            .forEach(System.out::print);
}   

测试:

playPass("I have $235");   // I have $764

推荐阅读