我有一个正在阅读配料表的应用程序。至此,我已经检索了2500种最常用成分的列表。因此,我有一个清单,例如10种成分作为字符串,以及2500种成分的列表,其中包含名称和其他属性。如果此字符串列表中的成分与成分列表中成分的名称匹配,我想将其添加到另一个存在的成分列表中。我知道如何做到这一点的唯一方法基本上是使用for循环。
我愿意这样做
fun compareLists(listOfIng: List<String>): List<ListIngredientsQuery.Item> {
var returnList = mutableListOf<ListIngredientsQuery.Item>()
for (ing in listOfIng) {
for (serverIngredient in MyApp.metaIngredientList!!) {
if (serverIngredient.name() == ing) {
returnList!!.add(serverIngredient)
}
}
}
return returnList
}
从技术上讲这是可行的,但是我必须想象有一种比迭代2500多个项目更好,更快的方法,其数量是“成分”列表中“成分”的多次。真正的开发人员偏爱的这种方式是正确的。
答案 0 :(得分:5)
由于每种成分名称都是唯一的,因此您可以使用哈希图以其名称为键来存储2500种成分。这样,您就不再需要遍历那个庞大的集合,而只需按名称查找,然后让哈希映射处理它即可。
答案 1 :(得分:3)
要在Marcin所说的内容上加上一些代码,这就是我要做的:
fun compareLists(listOfIng: List<String>) =
MyApp.metaIngredientList!!
.associateBy { it.name() }
.let { metaIngredientMap -> listOfIng.mapNotNull { metaIngredientMap[it] }}
或者如果我们想避免使用!!
fun compareLists(listOfIng: List<String) =
MyApp.metaIngredientList
?.associateBy { it.name() }
?.let { metaIngredientMap -> listOfIng.mapNotNull { metaIngredientMap[it] }}
?: emptyList<ListIngredientQuery.Item>()
当然,理想情况下,您希望MyApp.metaIngredientList已经是一个Map,而不是将其每次操作都转换成Map