从Kotlin中的字符串中找到对象的最佳方法是什么?

时间:2019-04-06 01:06:33

标签: list kotlin

我有一个正在阅读配料表的应用程序。至此,我已经检索了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多个项目更好,更快的方法,其数量是“成分”列表中“成分”的多次。真正的开发人员偏爱的这种方式是正确的。

2 个答案:

答案 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