У меня есть список в котлине, и если еще нужно распределить их по категориям

извините за мой английский, но у меня проблема. У меня есть список животных, и конструкция «если еще» должна разделить животных на категории и вывести правильную категорию на правильный вопрос.

заранее спасибо

      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)}")
}
Другие вопросы по тегам