Я хочу создать игру-угадайку слов, и в этих словах будут ответы. Как я могу вместо этого контролировать значение случайного слова?
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]
}
Я хочу изучить другой способ этого метода.
Вы можете использовать цикл 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 еще короче.
Если это единственный/основной способ использования этих данных, то я думаю, что их вообще не следует хранить в виде двух отдельных списков. Структура данных, которая сопоставляет один элемент с другим, представляет собой карту:
val map = mapOf(
"one" to "onek",
"two" to "twok",
// ...
)
println(map["one"]) // onek
Это гораздо проще реализовать в коде, но и гораздо быстрее, чем поиск по списку. И мы по-прежнему можем получить доступ к обеим оригинальным коллекциям с помощью map.keys и map.values. Технически это уже не списки, но элементы по-прежнему упорядочены правильно.
Если ваши данные изначально хранятся в виде двух списков и вы не можете это изменить, я все равно предлагаю создать карту и хранить ее где-нибудь, чтобы не создавать ее каждый раз. Это так же просто, как:
val map = list.zip(key).toMap()
Этот подход также не очень специфичен для Kotlin. Карты/словари существуют в большинстве языков программирования, и мы должны/могли бы использовать их в подобных случаях.
используйте внутренний синтаксический сахар, чтобы сделать код намного проще и чище.
val words = mapOf(
"one" to "one1",
"two" to "one2"
)
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]
}
Используйте цикл в этом простом случае