фильтровать / определять словарные ключи, которые имеют совпадающие значения - PullRequest
0 голосов
/ 23 января 2019

Не уверен, нужно ли мне сокращать, сортировать, фильтровать или использовать новые уникальные методы.Я даже попробовал Equatable решения.

Мне нужно автоматически идентифицировать ключи, которые имеют совпадающие значения, взять только эти ключи и поместить их в новый словарь или массив.

var userDB: [String:Any] = ["userID1":"gameIDa", "userID2":"gameIDa", "userID3":"gameIDc", "userID4":"gameIDd", "userID5":"gameIDe"]


Поскольку вы видите только этидва идентификатора имеют одинаковое значение gameIDa.Мне нужен вывод этого результата.

// [userID1, userID2]

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Во-первых, чтобы иметь возможность сравнивать значения, тип Dictionary Value должен быть Equatable. Как только это будет выполнено, вы можете легко отфильтровать ключи, содержащие запрашиваемое значение:

extension Dictionary where Value: Equatable {
    func keysWithCommonValues() -> [Key] {
        // go over all keys and keep ones for which the dictionary has one another key with the same value
        return keys.filter { key in contains { $0.key != key && $0.value == self[key] } }
    }
}

// userDB is not inferred as [String:String]
var userDB = ["userID1":"gameIDa", "userID2":"gameIDa", "userID3":"gameIDc", "userID4":"gameIDd", "userID5":"gameIDe"]
print(userDB.keysWithCommonValues()) // ["userID1", "userID2"]
0 голосов
/ 23 января 2019

Вы можете использовать Словарь (группировка: по:) , чтобы легко достичь этого, а затем уменьшить его до словаря, который содержит только записи с несколькими значениями.

var userDB: [String: String] = ["userID1":"gameIDa", "userID2":"gameIDb", "userID3":"gameIDc", "userID4":"gameIDa", "userID5":"gameIDe"]

let dict = Dictionary(grouping: userDB.keys) { userDB[$0] ?? "" }.reduce(into: [String:[String]](), { (result, element) in
    if element.value.count > 1 {
        result[element.key] = element.value
    }
})

ДИКТ

["gameIDa": ["userID1", "userID4"]]

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