Какой лучший способ найти объект из строки в kotlin? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть приложение, которое читает список ингредиентов.На данный момент я уже получил список из 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 ]

5 голосов
/ 06 апреля 2019

Поскольку каждое имя ингредиента уникально, вы можете использовать хэш-карту для хранения 2500 ингредиентов с именем в качестве ключа.Таким образом, вам больше не нужно перебирать эту огромную коллекцию, а просто посмотрите на вещи по имени и дайте хэш-карте разобраться с этим.

3 голосов
/ 06 апреля 2019

Чтобы добавить код к тому, что сказал Марцин, я бы сделал следующее:

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 уже был картой, а не преобразовывать ее в карту для каждой операции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...