Как мне отфильтровать массив словарей - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть массив библиотек с именем uniLib. Вот как это выглядит, когда я его печатаю (это только небольшая часть):

["Университет Лиможа": "Франция", "Университет Витаутаса Магнуса": "Литва", "Федеральный университет Сержипи": "Бразилия", "Политехнический институт Лиссабона": "Португалия", "Университет Сан" Буэнавентура ":" Колумбия "," Университет Видятама ":" Индонезия "," Технологический университет Чжэнчжоу ":" Китай "]

У нас есть список университетов с соответствующей страной, и я хотел бы отфильтровать этот словарь по стране, например, "Франция", и я должен получить новый массив словарей (или массив университетов, если это возможно). Я довольно новичок в Swift. Я уже некоторое время осматриваюсь, но ничего не могу найти, чтобы решить эту проблему.

Вот так выглядит мой массив и как он определяется:

universityNames =  json[].arrayValue.map {$0["name"].stringValue}
countryNames =  json[].arrayValue.map {$0["country"].stringValue}

// merge arrays
var uniLib : [String:String] = [:]
for (index, element) in universityNames.enumerated() {
uniLib[element] = countryNames[index] }

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Вы можете сделать что-то вроде этого:).

let universities = ["Université de Limoges": "France", "Vytautas Magnus University": "Lithuania", "Universidade Federal de Sergipe": "Brazil", "Instituto Politécnico de Lisboa": "Portugal", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"]

func filterUniversities(country: String) -> [String] {
    return universities
        .compactMap { tuple in
            return tuple.value == country ? tuple.key : nil
        }
}

print(filterUniversities(country: "France"))

Это вернет ["Université de Limoges"], что, я надеюсь, вы ищете, основываясь на вопросе.

Обновленное решение на основе комментария:

Я не уверен на 100%, каков ожидаемый результат, поэтому я создал два варианта:

let allUniversities = [
    ["Université de Limoges": "France", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"],
    ["Universidade Federal de Sergipe": "Brazil", "Vytautas Magnus University": "Lithuania"],
    ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]
]

func filterUniversities(country: String) -> [String] {
    return allUniversities
        .lazy
        .reduce([String]()) { (result, universities) in
            let filteredUniversities = universities.compactMap { $0.value == country ? $0.key : nil }

            return result + filteredUniversities
        }
}

print(filterUniversities(country: "France"))

func filterUniversityDictionaries(country: String) -> [[String: String]] {
    return allUniversities.lazy.filter { $0.values.contains(country) }
}

print(filterUniversityDictionaries(country: "France"))

Это даст вам следующий результат:

["Université de Limoges", "Sorbonne"]

[["Zhengzhou University of Technology": "China", "Universidad de San Buenaventura": "Colombia", "Université de Limoges": "France", "Universitas Widyatama": "Indonesia"], ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]]
0 голосов
/ 09 апреля 2019
uniLib.lazy                         // Lazy so we don't have to allocate a temporary
    .filter { $0.value == country } // Find key/value pairs where value == country
    .map { $0.key }                 // Return the key (name)

Единственная причина для беспокойства с lazy здесь заключается в том, что если бы uniLib было довольно большим, и шаг filter имел бы тенденцию находить много элементов.Без ленивых есть временный словарь, созданный filter и немедленно выброшенный.

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