Поиск в словаре по различным условиям Swift - PullRequest
2 голосов
/ 23 мая 2019

У меня есть простой словарь

var countOfR = ["R0": 0, "R1": 0, "R2": 0, "R3": 0, "R4": 0, "R5": 0, "R6": 0]

Мне нужно проверить этот словарь по нескольким условиям.Например, следующий оператор работает отлично:

for index in countOfR {
        if index == ("R0",2) || index == ("R1",2) || index == ("R2",2) || index == ("R3",2) || index == ("R4",2) || index == ("R5",2) || index == ("R6",2) {
            type = "P"

Это найдет одну "пару".Но затем мне нужно проверить «две пары» - «ПП».Страшно написать что-то вроде этого:

if index == ("R0",2) && index == ("R1",2) || index == ("R0",2) && index == ("R2",2) || index == ("R0",2) && index == ("R3",2) || index == ("R0",2) && index == ("R4",2) || index == ("R0",2) && index == ("R5",2) || index == ("R0",2) && index == ("R6",2) || ...

и так далее ... Мне также нужно искать «пара и триг», «три пары» и многие другие.Для лучшего понимания:

["R0": 1, "R1": 2, "R2": 1, "R3": 1, "R4": 0, "R5": 1, "R6": 0] - это «P»,

["R0": 1, "R1": 0, "R2": 0, "R3": 1, "R4": 0, "R5": 2, "R6": 0] - это тоже «P»,

["R0": 1, "R1": 0, "R2": 2, "R3": 1, "R4": 0, "R5": 2, "R6": 0] - это «PP»

Как я могу решить эту задачу?Пожалуйста, дайте мне совет!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

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

Полагаю, вам просто нужно посчитать количество записей, значение которых равно2.

Вы можете написать что-то вроде этого:

func getType(_ countOfR: [String: Int]) -> String {
    let pairs = countOfR.filter{$0.value == 2}.count
    let trines = countOfR.filter{$0.value == 3}.count
    let type = String(repeating: "P", count: pairs) + String(repeating: "T", count: trines)
    return type
}
print(getType(["R0": 1, "R1": 2, "R2": 1, "R3": 1, "R4": 0, "R5": 1, "R6": 0]))
//->P
print(getType(["R0": 1, "R1": 0, "R2": 0, "R3": 1, "R4": 0, "R5": 2, "R6": 0]))
//->P
print(getType(["R0": 1, "R1": 0, "R2": 2, "R3": 1, "R4": 0, "R5": 2, "R6": 0]))
//->PP
0 голосов
/ 23 мая 2019

Создайте словарь с вашими условиями и отфильтруйте основной словарь, сравнивая словарь условий. Тип будет создан на основе отфильтрованного результата.

var condition = ["R0":2,"R1":2,"R2":2,"R3":2,"R4":2,"R5":2,"R6":2]

let test1 = ["R0": 1, "R1": 2, "R2": 1, "R3": 1, "R4": 0, "R5": 1, "R6": 0]// is "P",
let count1 = test1.filter { index in condition.contains(where: { $0 == index }) }.count
let type1 = String(repeating: "P", count: count1)
print(type1)//P

let test2 = ["R0": 1, "R1": 0, "R2": 0, "R3": 1, "R4": 0, "R5": 2, "R6": 0]// is "P" too,
let count2 = test2.filter { index in condition.contains(where: { $0 == index }) }.count
let type2 = String(repeating: "P", count: count2)
print(type2)//P

let test3 = ["R0": 1, "R1": 0, "R2": 2, "R3": 1, "R4": 0, "R5": 2, "R6": 0]// is "PP"
let count3 = test3.filter { index in condition.contains(where: { $0 == index }) }.count
let type3 = String(repeating: "P", count: count3)
print(type3)//PP
...