Шаг 81.
Основы Kotlin.
Строки. Извлечение подстроки (split)

    На этом шаге мы рассмотрим назначение и использование этой функции.

    Меню таверны будет представлено строкой, в которой через запятую перечисляются: вид напитка, название, цена (в монетах). Например:

  shandy,Dragon's Breath,5.91

    Ваше следующее задание - добавить в функцию placeOrder() возможность принимать данные из меню таверны и выводить название, тип и цену напитка, заказанного посетителем. Измените объявление placeOrder(), добавив прием данных, и передайте ей данные из меню в точке вызова placeOrder().

const val TAVERN_NAME = "Taernyl's Folly"

fun main() {
    placeOrder("shandy,Dragon's Breath,5.91")
}

private fun placeOrder(menuData: String) {
    val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
    val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
    println("Madrigal speaks with $tavernMaster about their order.")
}


Рис.1. Передача информации о таверне в placeOrder (Tavern.kt)

    Далее, для извлечения отдельных компонентов меню воспользуемся функцией split(), которая разбивает строку на подстроки по заданному разделителю. Добавьте split() в placeOrder().

.   .   .   .
private fun placeOrder(menuData: String) {
    val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
    val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
    println("Madrigal speaks with $tavernMaster about their order.")
    val data = menuData.split(',')
    val type = data[0]
    val name = data[1]
    val price = data[2]
    val message = "Madrigal buys a $name ($type) for $price."
    println(message)
}


Рис.2. Разделение данных меню (Tavern.kt)

    Функция split() принимает символ-разделитель и возвращает список подстрок без разделителя. (Списки, с которыми мы познакомимся позже, хранят последовательности элементов.) В нашем случае split() возвращает список строк в порядке их следования в оригинальной строке. Вы используете индексы в квадратных скобках, называемые оператором индексированного доступа, чтобы извлечь первую, вторую и третью строки из списка и присвоить их переменным type, name и price.

    Наконец, как и раньше, вы включаете строки в сообщение, используя интерполяцию строк.

    Запустите Tavern.kt. Вы увидите заказ, включающий напиток, его тип и цену.

  Madrigal speaks with Taernyl about their order. 
  Madrigal buys a Dragon's Breath (shandy) for 5.91.

    Так как split() возвращает список, для нее поддерживается упрощенный синтаксис, который называется деструктуризацией. Деструктуризация - это возможность объявить и инициализировать сразу несколько переменных. Замените отдельные операции присваивания в placeOrder(), использовав синтаксис деструктуризации.

.   .   .   .
private fun placeOrder(menuData: String) {
    val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
    val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
    println("Madrigal speaks with $tavernMaster about their order.")
    val (type, name, price) = menuData.split(',')
    val message = "Madrigal buys a $name ($type) for $price."
    println(message)
}
Файл с проектом можно взять здесь.


Рис.3. Деструктуризация данных из меню (Tavern.kt)

    Деструктуризация часто помогает упростить присваивание значений сразу нескольким переменным. В любом случае, когда результат - это список, можно использовать синтаксис деструктуризации. Кроме списков (тип List), деструктурирующее присваивание поддерживается также для ассоциативных массивов (тип Map) и пар (тип Pair) и для классов данных.

    Запустите Tavern.kt еще раз. Результаты должны быть такими же.

    На следующем шаге мы рассмотрим работу со строками.




Предыдущий шаг Содержание Следующий шаг