Как мне избежать использования слишком большого количества «если» в Котлине?

Я хочу создать игру-угадайку слов, и в этих словах будут ответы. Как я могу вместо этого контролировать значение случайного слова?

val list = listOf("one", "two", "three", "four", "five")
val key = listOf("onek", "twok", "threek", "fourk", "fivek")
if (binding.randomWord.text == list[0]) {

    binding.wordMeaning.text = key[0]
}

if (binding.randomWord.text == list[1]) {

    binding.wordMeaning.text = key[1]
}

if (binding.randomWord.text == list[2]) {

    binding.wordMeaning.text = key[2]
}

if (binding.randomWord.text == list[3]) {

    binding.wordMeaning.text = key[3]
}

if (binding.randomWord.text == list[4]) {

    binding.wordMeaning.text = key[4]
}

Я хочу изучить другой способ этого метода.

Используйте цикл в этом простом случае

Sami Kuhmonen 10.05.2024 18:11
2
1
126
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете использовать цикл for. В Котлине это будет что-то вроде:

for (idx in list.indices) {
    
    if (binding.randomWord.text == list[idx]) {
        binding.wordMeaning.text = key[idx]
    }
}

Просто убедитесь, что ваши массивы всегда имеют одинаковую длину, иначе вы получите ошибочные результаты.

поскольку ответ (ключ) для каждого вопроса (списка) будет находиться в одном и том же индексе, вы можете найти индекс вопроса, используя list.indexOf().

binding.wordMeaning.text = key[list.indexOf(binding.randomWord.text)]

Однострочная версия @broot еще короче.

Leviathan 10.05.2024 20:47

Если это единственный/основной способ использования этих данных, то я думаю, что их вообще не следует хранить в виде двух отдельных списков. Структура данных, которая сопоставляет один элемент с другим, представляет собой карту:

val map = mapOf(
    "one" to "onek",
    "two" to "twok",
//        ...
)

println(map["one"]) // onek

Это гораздо проще реализовать в коде, но и гораздо быстрее, чем поиск по списку. И мы по-прежнему можем получить доступ к обеим оригинальным коллекциям с помощью map.keys и map.values. Технически это уже не списки, но элементы по-прежнему упорядочены правильно.

Если ваши данные изначально хранятся в виде двух списков и вы не можете это изменить, я все равно предлагаю создать карту и хранить ее где-нибудь, чтобы не создавать ее каждый раз. Это так же просто, как:

val map = list.zip(key).toMap()

Этот подход также не очень специфичен для Kotlin. Карты/словари существуют в большинстве языков программирования, и мы должны/могли бы использовать их в подобных случаях.

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

Шаг 1. Определите словарь слов и значений с помощью неизменяемой карты.

val words = mapOf(
    "one" to "one1",
    "two" to "one2"
)

Шаг 2. Выберите случайный интерфейс и обновите его.

words.keys.random().also { randonWord ->
    binding.randomWord.text = randonWord
}
  • Функция .also — это функция области видимости в Котлине, которая работает с объектом и возвращает сам объект.
  • Внутри .alsorandomWord установлен в привязке.randomWord.

Понял тебя, Всегда старайтесь использовать операторы if, когда существует несколько условий.

val list = listOf("one", "two", "three", "four", "five")
val key = listOf("onek", "twok", "threek", "fourk", "fivek")

val index = list.indexOf(binding.randomWord.text)

// Use when expression to set the word meaning based on the index
binding.wordMeaning.text = when (index) {
   0 -> key.getOrElse(0) { "" } 
   1 -> key.getOrElse(1) { "" } 
   2 -> key.getOrElse(2) { "" }  
   3 -> key.getOrElse(3) { "" } 
   4 -> key.getOrElse(4) { "" } 
   else -> ""                    
}

Я думаю, вы также можете сделать это следующим образом:

val list = listOf("one", "two", "three", "four", "five")
val key = listOf("onek", "twok", "threek", "fourk", "fivek")

val index = list.indexOf(binding.randomWord.text)

if (index < key.size) {
    binding.wordMeaning.text = key[index]
}

Этот ответ только улучшение ответа @Mohammed Shahbaz

Ответ принят как подходящий

Лучше всего было бы создать Карту и задать пары значений ключа для слова и ответов к ним. Наконец, вы можете сократить использование операторов if, используя оператор if вместо if. Оператор When будет учитывать выбор пользователя и через карту сможет вернуть ему соответствующий ответ.

Пример:

val map = mapOf("one" to "onek", "two" to "twok")

when (binding.randomWord.text) {
    "one", "two" -> map[binding.randomWord.text]
}

Другие вопросы по теме