Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Классик правильно ли скобки расставлены и все ли закрыты.
- При рекурсии схлопывается из-за Optional.empty()
- */
- static String checkBrackets(String input) {
- return checkBrackets("(" + input + ")", new Val(0, (char) 0)).map(val -> val.index > input.length())
- .orElse(false) ?
- "Правильно" : "Неправильно";
- }
- record Val(int index, char bracket) {
- }
- static Optional<Val> checkBrackets(String input, Val val) {
- record Brackets(char open, char close) {
- static Optional<Brackets> of(char a) {
- return Optional.ofNullable(switch (a) {
- case '(', ')' -> new Brackets('(', ')');
- case '[', ']' -> new Brackets('[', ']');
- case '{', '}' -> new Brackets('{', '}');
- default -> null;
- });
- }
- }
- final var now = input.charAt(val.index);
- return Brackets.of(now).flatMap(br -> switch (val) {
- case Val(var i, var b) when i == 0 -> checkBrackets(input, new Val(i + 1, b));//start recursion
- case Val(var i, _) when now == br.close -> Optional.of(new Val(i, now));//if found close bracket
- case Val(var i, var b) -> checkBrackets(input, new Val(i + 1, b)).flatMap(v -> switch (v) {
- case Val(_, var in_b) when br.close != in_b -> Optional.empty();//bracket error
- case Val(var in_i, _) when input.length() - 1 <= in_i -> Optional.empty();//size error
- case Val(var in_i, _) -> checkBrackets(input, new Val(in_i + 1, val.bracket));//found to up
- }
- );
- });
- }
Advertisement
Add Comment
Please, Sign In to add comment