Kotlin:mutableMap 无法识别 put()

Kotlin: mutableMap doesn't recognise put()

提问人:Donagh 提问时间:3/21/2021 更新时间:3/21/2021 访问量:2282

问:

这是食谱应用程序的一部分。我在我写的食谱课上。成分是我写的另一门课。这个想法是将成分及其数量(作为 Int)存储在地图中。

在类正文中,我已将地图声明为:

var ingredients: Map<Ingredient, Int>

在 init{} 正文中:

ingredients = mutableMapOf<Ingredient, Int>()

这就是问题所在 - 此功能是添加成分。如果成分已经在地图中,它会更新数量。put()方法应该这样做,但Android Studio将其变为红色,当我将鼠标悬停在“put”一词上时,它显示“未解析的引用:put”。加号还带有红色下划线。我认为这是可变地图的基本部分。我哪里做错了?(别担心 - 会有“其他”部分!

fun addIngredientAndAmount(ingredient: Ingredient, quantity: Int) {
    if (ingredients.containsKey(ingredient)) {
        val oldQuantity = ingredients[ingredient]
        ingredients.put(ingredient, oldQuantity + quantity)
    }
}
字典 科特林 可变

评论

0赞 Tenfour04 3/21/2021
您将该属性标记为 ,而不是 。即使基础对象恰好是可变的,编译器也只能看到属性类型。但是,为什么要在单独的块中初始化属性呢?MapMutableMapinit
0赞 Donagh 3/22/2021
我们正在初始化 init 块中的其他一些东西,所以它看起来更整洁一些。此外,这是我们第一次在项目中使用 Kotlin,我们更习惯于 Java。就上下文而言,这是一个作为硕士课程一部分的小组项目。

答:

8赞 gpunto 3/21/2021 #1

Your 被声明为 ,但表示只读接口,因此它没有 ,它是 的函数。将其初始化为 并不重要,因为编译器会检查您为变量指定的类型。ingredientsMapMapputMutableMapMutableMap

您应该将其声明为:

var ingredients: MutableMap<Ingredient, Int>

您也可以就地初始化它,而不是使用块:init

var ingredients: MutableMap<Ingredient, Int> = mutableMapOf<Ingredient, Int>()

如果这样做,还可以避免显式声明类型,因为编译器会自动推断它。

var ingredients = mutableMapOf<Ingredient, Int>()

var ingredients: MutableMap<Ingredient, Int> = mutableMapOf()

评论

0赞 Donagh 3/21/2021
谢谢,这奏效了!我之前试过它,它变成了红色,所以我想我拼错了什么的。憨。但是,加号仍然用红色下划线 - 我只想将两个整数加在一起。在 put() 方法中使用它之前,真的有必要将其放在单个变量中吗?
0赞 Donagh 3/22/2021
没关系,我通过添加来修复它!After Ingredients[成分]
0赞 Tenfour04 3/22/2021
我还建议将其设置为.对可变集合使用读写属性很容易出错,因为它可以通过两种不同的方式进行更改。在某些情况下,您可能需要这种灵活性,但这种情况应该很少见。val
0赞 gidds 3/22/2021
@Donagh是一种代码气味——表明可能存在潜在问题,并且通常有更好的方法。在这种情况下,您可以从地图中获取现有值,如果它不是 null,则更新它。一种简洁的方法可能是:......!!ingredients[ingredient]?.let{ ingredients[ingredient] = it + quantity }
0赞 gidds 3/22/2021
…尽管从方法名称来看,我怀疑您的部分也会为新成分设置值。您可以在一行中同时执行这两项操作:.elseingredients[ingredient] = (ingredients[ingredient] ?: 0) + quantity