как использовать .contains, чтобы выбрать определенные буквы алфавита - PullRequest
1 голос
/ 27 февраля 2020

Мне нужно, чтобы пользователь вводил:
- без цифр
- длиной до 4 символов
- используйте только определенные буквы алфавита [R, B, G, P, Y, O]
Я выяснил, как делать не цифры, а только длину 4 символа, однако я не могу понять, как ограничить определенные буквы алфавита (все, кроме R, B, G, P, Y, O .)

        guess = input.nextLine();
        guess = guess.toUpperCase();
        while (guess.length() != 4 || guess.contains("[0-9]") || guess.contains("[ACDEFHIJKLMNQSTUVWXZ]")) {
            System.out.println("Bad input! Try again");
            System.out.println("Use the form \"BGRY\"");
            guess = input.nextLine();
        }

Это код, который у меня есть, кажется, он не работает

Ответы [ 2 ]

6 голосов
/ 27 февраля 2020

Сделайте это следующим образом:

while(!guess.matches("[RBGPYO]{4}")) {
    // ...
}

Демонстрация:

public class Main {
    public static void main(String s[]) {
        // Tests
        System.out.println(matches("RBGPYO"));
        System.out.println(matches("RBGP"));
        System.out.println(matches("R1BGP"));
        System.out.println(matches("ABCD"));
        System.out.println(matches("1234"));
        System.out.println(matches("BGPY"));
        System.out.println(matches("BYPG"));
    }

    static boolean matches(String input) {
        return input.matches("[RBGPYO]{4}");
    }
}

Выход:

false
true
false
false
false
true
true
0 голосов
/ 27 февраля 2020

Существует также множество способов без использования регулярных выражений.

В этом случае нельзя использовать String::contains, поскольку этот метод работает с определенной последовательностью символов и ваш вариант использования слишком конкретен c. Тем не менее, вы можете использовать преимущество List::contains, которое может быть более полезным, если понимать под String как List<Character>, используя :

List<Integer> characters = "RBGPYO".chars()
    .boxed()
    .collect(Collectors.toList());

boolean matches = guess.length() == 4 && 
    guess.toUpperCase().chars().allMatch(characters::contains);

Если вы не являетесь поклонником этой функции, старый добрый способ для -l oop:

List<Character> characters = Arrays.asList('R', 'B', 'G', 'P', 'Y', 'O');
boolean matches = guess.length() == 4;
if (matches) {
    for (char ch : guess.toUpperCase().toCharArray()) {
        if (!characters.contains(ch)) {
            matches = false;             
            break;                         // it's important to break the cycle
        }
    }
}

В любом случае, важно, чтобы проверьте длину, прежде чем проверять символы . Это действительно до тех пор, пока guess должен содержать символы и иметь определенную длину.

...