Проверка строчных и прописных букв на строке - PullRequest
0 голосов
/ 21 декабря 2018

Так что в основном мне нужно запустить программу, которая проверяет, является ли первый символ заглавными.Если это так, то это проходит.Затем мне нужно проверить, являются ли остальные мои символы строчными.В настоящее время у меня есть этот код, но проблема в том, что, если я вставляю строчные буквы в строку, а затем заканчиваю строчными буквами, она завершается, но это не предполагалось.Программа должна запросить у пользователя другое «имя», если у него есть заглавные буквы после первого символа.(извините, если это не было ясно, мой английский не так уж велик: /)

var lowercases = ' '
do {
    println("Insert a name")
    val name = readLine()!!.toString()
    val First = name[0]
    if (First.isUpperCase()) {
        for (caracter in 1 until name.length) {
            lowercases = name[caracter]
            if (lowercases.isLowerCase()) {


            }
        }
    } else{
        println("olha nao da")
    }
} while (First.isLowerCase() || lowercases.isUpperCase())

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я бы разделил чек на отдельную функцию.Это не только упрощает логику, но и позволяет дать ей описательное имя.И он хорошо подходит в качестве функции расширения для String:

fun String.isTitleCase()
    = isNotEmpty() && this[0].isUpperCase() && drop(1).all{ it.isLowerCase() }

Это означает, что String является регистром заголовка, если он не пустой, его первый символ является заглавным, и все символы, кроме первогострочные.(Если вы хотите обрабатывать лигатуры, вы также должны проверить isTitleCase() на первом символе, а также isUpperCase().)

(Конечно, вы можете написать это как стиль блока,многострочная функция, возможно, с циклом и return с - но когда все остальное равно, я предпочитаю более короткую версию!)

Тогда ваш основной код не должен беспокоиться о том, как выполняется проверкаи становится проще:

while (true) {
    println("Enter a name:")
    val name = readLine()
    if (name != null && name.isTitleCase()) {
        // Do stuff
        break
    } else {
        println("olha nao da")
    }
}

(я заменил !! пустой проверкой, что намного безопаснее. Я также изменил цикл dowhile на while цикл с break, чтобы избежать повторения проверки. И нет необходимости звонить toString(), так как readLine() уже дает вам String или null.)

0 голосов
/ 21 декабря 2018

Использование регулярного выражения быстрее и чище:

val regex = """[A-Z][^A-Z]+""".toRegex()
var name
do{
    println("Insert a name")
    name = readLine()?.toString() :? "."
}while(!regex matches name)

другим способом:

do {
    println("Insert a name")
    val name = readLine()!!.toString()
    var curChar = name[0]
    if(name.length > 1){
        if (curChar.isUpperCase()) {
           for (i in 1 until name.length) {
               curChar = name[i]
               if (curChar.isLowerCase()) {
                  // you send no code for this block
               }else{
                  break//as you wish if character is uppercase asks from user again
               }
           }
        } else{
           println("olha nao da")//your message as you send
        }
    }
} while (curChar.isUpperCase())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...