У меня есть список в котлине, и если еще нужно распределить их по категориям
извините за мой английский, но у меня проблема. У меня есть список животных, и конструкция «если еще» должна разделить животных на категории и вывести правильную категорию на правильный вопрос.
заранее спасибо
fun main() {
val animalList = mutableListOf(
"whale",
"cat",
"dog",
"dolphin",
"parrot",
"eagle",
"fox",
"bear",
"lion",
"tiger")
println("What kind of animal would you like? Wild, predatory, home, can fly")
val question: String? = "Wild animal"
if (question == "Wild animal") {
print("Your question: ")
val question = readLine()
println("Wild animals: whale, dolphin, eagle, fox, bear, lion, tiger")
} else if (question == "Home pets") {
println("Home pets: cat, dog, parrot")
} else if (question == "Predator") {
println("Predator: eagle, fox, bear, lion, tiger")
} else if (question == "Can fly") {
println("Can fly: eagle and parrot")
} else {
println("Error")
}
}
3 ответа
Я бы, вероятно, определил категории и животных как перечисления, как показано ниже, а затем создал сопоставление между категорией и животными (см.categoryToAnimals
ниже).
Как показано в main, вы можете заменить if/else наwhen
.
enum class AnimalCategory(val description: String) {
Wild("Wild animals"),
Predator("Predators"),
Home("Home pets"),
CanFly("Can fly");
}
enum class Animal {
Bear,
Cat,
Dog,
Dolphin,
Eagle,
Fox,
Lion,
Parrot,
Tiger,
Whale;
}
val categoryToAnimals = mapOf(
AnimalCategory.Wild to setOf(
Animal.Bear,
Animal.Dolphin,
Animal.Eagle,
Animal.Fox,
Animal.Lion,
Animal.Tiger,
Animal.Whale
),
AnimalCategory.Home to setOf(Animal.Cat, Animal.Dog, Animal.Parrot),
AnimalCategory.Predator to setOf(Animal.Bear, Animal.Eagle, Animal.Fox, Animal.Lion, Animal.Tiger),
AnimalCategory.CanFly to setOf(Animal.Eagle, Animal.Parrot),
)
fun printAnimalList(animalCategory: AnimalCategory) {
println("${animalCategory.description}: ${categoryToAnimals[animalCategory]!!.joinToString(", ")}")
}
fun main() {
println("What kind of animal would you like? Wild, predatory, home, can fly")
val question = readLine() ?: ""
when (question.lowercase()) {
"wild" -> printAnimalList(AnimalCategory.Wild)
"home" -> printAnimalList(AnimalCategory.Home)
"predatory" -> printAnimalList(AnimalCategory.Predator)
"can fly" -> printAnimalList(AnimalCategory.CanFly)
else -> println("Error")
}
}
Несмотря на то, что контекст и вариант использования мне не совсем понятен, я постараюсь ответить на него. Пожалуйста, попробуйте этот код
fun main() {
val animalList = mutableListOf(
"whale",
"cat",
"dog",
"dolphin",
"parrot",
"eagle",
"fox",
"bear",
"lion",
"tiger")
println("What kind of animal would you like? Wild, predatory, home, can fly")
var question = readLine()
if (question == "Wild animal"){
println("Wild animals: whale, dolphin, eagle, fox, bear, lion, tiger")
}else if (question == "Home pets"){
println("Home pets: cat, dog, parrot")
}else if (question == "Predator"){
println("Predator: eagle, fox, bear, lion, tiger")
}else if (question == "Can fly"){
println("Can fly: eagle and parrot")
}else{
println("Error")
}
}
Я бы решил это, используя класс животных, где его категории находятся в свойстве перечисления vararg.
data class Animal(val name: String, vararg val categories: Animal.Category) {
enum class Category {
Wild("Wild animals"),
Predator("Predators"),
Home("Home pets"),
CanFly("Can fly");
}
}
Затем вы можете создать список из них и отфильтровать его, чтобы получить ответ.
fun main() {
val availableAnimals = listOf(
Animal("whale", Animal.Category.Wild),
Animal("cat", Animal.Category.Home),
Animal("dog", Animal.Category.Home),
Animal("dolphin", Animal.Category.Wild),
Animal("parrot", Animal.Category.Home, Animal.Category.CanFly),
Animal("eagle", Animal.Category.Wild, Animal.Category.CanFly, Animal.Category.Predator),
Animal("fox", Animal.Category.Wild, Animal.Category.Predator),
Animal("bear", Animal.Category.Wild, Animal.Category.Predator),
Animal("lion", Animal.Category.Wild, Animal.Category.Predator),
Animal("tiger", Animal.Category.Wild, Animal.Category.Predator)
)
println("What kind of animal would you like? ${Animal.Category.values().map(Animal.Category::name).joinToString()}")
val response = readln()
val responseCategory = Animal.Category.firstOrNull { it.name == response }
if (responseCategory == null) {
println("Error")
return
}
val result = availableAnimals.filter { responseCategory in it.categories }
println("${response}: ${result.joinToString(Animal::name)}")
}