将数字总和计算为一行,输入有 3 位数字
Calculate digit sum as a one liner, input has 3 digits
我必须在一行中计算字符串的数字总和(通过扫描仪读取)。另外,我必须确保仅在输入正好有 3 位数字时才计算输入。
到目前为止我得到了什么:
public class Test{
public static void main(String... args) {
System.out.print(new java.util.Scanner(System.in).nextLine().chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b));
}
}
但是我怎样才能证明那一行中正好有 3 位数字呢?
将您的代码包装在 Optional
中,使用 filter()
检查长度并使用 orElse()
为错误的长度输入提供输出:
System.out.print(Optional.of(new Scanner(System.in).nextLine())
.filter(str -> str.matches("\d{3}")).map(str -> str.chars().sum() - '0' * 3)
.orElse("invalid input"));
请注意,您可以替换:
.mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b)
与:
.map(i -> ((char)i)-'0').sum()
或者,因为您刚好有 3 位数字,所以:
.sum() - '0' * 3
所以这可能是这样的。为可读性添加换行符
public static void main(String... args) {
System.out.print(
//Make input into String-Stream
Arrays.asList(new java.util.Scanner(System.in).nextLine()).stream()
//Throw away averything not three digits
.filter(s -> s.matches("\d{3}"))
//Perform digit-sum (make it a String)
.map(e -> ""+e.chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b))
//return this if there is something
.findFirst()
//Or give error message
.orElse("No valid input!"));
}
这个怎么样。缺少输出表示输入错误(因为您没有指定在这种情况下要做什么)。
Stream.of(new Scanner(System.in).nextLine()).
// three digits
filter(s->s.matches("\d{3}"))
// convert to integer
.map(Integer::valueOf)
// find the sum
.map(n->n/100 + (n/10)%10 + n%10)
// and print it
.forEach(System.out::println);
如果您想要错误消息,可以执行以下操作:
System.out.println(Stream.of(new Scanner(System.in)
.nextLine())
.filter(a -> a.matches("\d{3}"))
.map(Integer::valueOf)
.map(a -> a / 100 + (a / 10) % 10 + a % 10)
// convert back to string
.map(Object::toString)
.findFirst()
.orElse("Not 3 digits"));
我必须在一行中计算字符串的数字总和(通过扫描仪读取)。另外,我必须确保仅在输入正好有 3 位数字时才计算输入。
到目前为止我得到了什么:
public class Test{
public static void main(String... args) {
System.out.print(new java.util.Scanner(System.in).nextLine().chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b));
}
}
但是我怎样才能证明那一行中正好有 3 位数字呢?
将您的代码包装在 Optional
中,使用 filter()
检查长度并使用 orElse()
为错误的长度输入提供输出:
System.out.print(Optional.of(new Scanner(System.in).nextLine())
.filter(str -> str.matches("\d{3}")).map(str -> str.chars().sum() - '0' * 3)
.orElse("invalid input"));
请注意,您可以替换:
.mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b)
与:
.map(i -> ((char)i)-'0').sum()
或者,因为您刚好有 3 位数字,所以:
.sum() - '0' * 3
所以这可能是这样的。为可读性添加换行符
public static void main(String... args) {
System.out.print(
//Make input into String-Stream
Arrays.asList(new java.util.Scanner(System.in).nextLine()).stream()
//Throw away averything not three digits
.filter(s -> s.matches("\d{3}"))
//Perform digit-sum (make it a String)
.map(e -> ""+e.chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b))
//return this if there is something
.findFirst()
//Or give error message
.orElse("No valid input!"));
}
这个怎么样。缺少输出表示输入错误(因为您没有指定在这种情况下要做什么)。
Stream.of(new Scanner(System.in).nextLine()).
// three digits
filter(s->s.matches("\d{3}"))
// convert to integer
.map(Integer::valueOf)
// find the sum
.map(n->n/100 + (n/10)%10 + n%10)
// and print it
.forEach(System.out::println);
如果您想要错误消息,可以执行以下操作:
System.out.println(Stream.of(new Scanner(System.in)
.nextLine())
.filter(a -> a.matches("\d{3}"))
.map(Integer::valueOf)
.map(a -> a / 100 + (a / 10) % 10 + a % 10)
// convert back to string
.map(Object::toString)
.findFirst()
.orElse("Not 3 digits"));