如何从Kotlin的food列表中获取指定索引、名称及价格?
解决方案
你当前的问题有两个核心点:一是直接打印foodInfo对象会调用其默认toString()方法,输出完整的对象结构;二是用户输入的菜单编号是从1开始的,直接作为列表索引会导致索引越界(比如选1时会取food[1],对应菜单里的Burger而不是Pizza)。
修改后的完整代码:
data class foodInfo( val name: String, val price: Int ) class Foods { private val food = mutableListOf( foodInfo("Pizza", 50000), foodInfo("Burger", 40000), foodInfo("Fried Rice", 40000), foodInfo("Noodle", 15000), foodInfo("Salad", 5000) ) fun displayMenu() { food.forEachIndexed { index, foodInfo -> println("${index + 1}. ${foodInfo.name} = ${foodInfo.price}/porsi") } } // 接收用户输入的1-based菜单编号,内部转成列表的0-based索引 fun foodSelected(menuNumber: Int){ val actualIndex = menuNumber - 1 val selectedFood = food[actualIndex] // 自定义输出格式,提取需要的信息 println("你选择了第 ${menuNumber} 号菜单:${selectedFood.name},价格 ${selectedFood.price}/porsi") } // 对外暴露菜单数量,用于输入校验 fun getMenuCount() = food.size } fun main(){ val foods = Foods() foods.displayMenu() print("Pick Menu: ") val selectMenu = readln().toInt() // 增加输入合法性校验,避免非法输入崩溃 if (selectMenu in 1..foods.getMenuCount()) { foods.foodSelected(selectMenu) } else { println("无效的菜单编号,请输入1-${foods.getMenuCount()}之间的数字") } }
关键修改说明:
- 索引转换:将用户输入的1-based编号转成列表的0-based索引(
menuNumber - 1),确保取到正确的菜单数据 - 自定义输出:不再直接打印
foodInfo对象,而是提取name和price属性,结合菜单编号拼接成需要的输出内容 - 实例复用:main函数中只创建一个
Foods实例,避免重复初始化菜单列表 - 输入校验:增加范围判断,防止用户输入超出菜单数量的数字导致崩溃
内容的提问来源于stack exchange,提问作者ryhanhxx
相关产品推荐
相关产品推荐

