Вычислить di git sum как один лайнер, вход состоит из 3 цифр - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно вычислить di git сумму строки (считанную через сканер) в одном лайнере. Кроме того, я должен убедиться, что ввод рассчитывается только в том случае, если ввод содержит ровно 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 цифры?

Ответы [ 3 ]

4 голосов
/ 18 июня 2020

Оберните свой код в 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
2 голосов
/ 18 июня 2020

Так что это может быть что-то вроде этого. Добавлены разрывы строк для удобочитаемости

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!"));
    }
1 голос
/ 18 июня 2020

Как насчет этого. Отсутствие вывода указывает на неправильный ввод (поскольку вы не указали, что делать в этом случае).

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"));



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...