Случайные элементы из словаря - PullRequest
0 голосов
/ 14 января 2020

Вот мой массив словаря,

var myArrayOfDict =  [["vegetables": ["CARROT","BEANS"], "fruits": ["APPLE","MANGO","BANANA"], "letters":["A","B","C","D"],"numbers":["ONE","TWO","THREE"],"shapes":["SQUARE","RECTANGLE","CIRCLE"]]]

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

[["fruits": ["APPLE","MANGO","BANANA"],"shapes":["SQUARE","RECTANGLE","CIRCLE"],"numbers":["ONE","TWO","THREE"]]]

Когда мне нужно всего 2 элемента, как случайным образом,

[["shapes":["SQUARE","RECTANGLE","CIRCLE"],"fruits": ["APPLE","MANGO","BANANA"]]]

Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Array myArrayOfDict содержит один Dictionary. Таким образом, не имеет смысла получать случайный элемент из него.

Как показывает ваш пример, вам нужно получить случайные элементы из самого Dictionary.

Итак, вы можете использовать randomElement, чтобы заставить это работать.

let myArrayOfDict =  ["vegetables": ["CARROT","BEANS"], "fruits": ["APPLE","MANGO","BANANA"], "letters":["A","B","C","D"],"numbers":["ONE","TWO","THREE"],"shapes":["SQUARE","RECTANGLE","CIRCLE"]]

var elements = [String : [String]]()
let count = 2
for _ in 0..<count {
    if let element = myArrayOfDict.randomElement() {
        elements[element.key] = element.value
    }
}
print(elements)
0 голосов
/ 14 января 2020

Вот одно решение, использующее randomElement().

func randomSelection(from dict: [String: [String]], count: Int) -> [String: [String]] {    
    guard !dict.isEmpty else { return [:] }

    var result = [String: [String]]()

    for i in 0..<count {
        let element = dict.randomElement()! //We know dictionary is not empty
        result[element.key] = element.value  
    }
    return result
}

Приведенное выше решение может вернуть меньше элементов в словаре, чем ожидалось, если один и тот же элемент будет возвращен более чем один раз из randomElemnt(). Если это следует аннулировать, то приведенное ниже решение должно работать

func randomSelection(from dict: [String: [String]], count: Int) -> [String: [String]] {
    guard !dict.isEmpty else { return [:] }
    guard dict.count > count else { return dict }

    var result = [String: [String]]()

    while result.count < count {
        let element = dict.randomElement()!
        if result[element.key] == nil { 
            result[element.key] = element.value        
        }
    }
    return result
}

Поскольку функция принимает словарь в качестве первого аргумента, массив должен быть зациклен на

for d in myArrayOfDict {
    print(randomSelection(from: d, count: 2))
}
...