Xcode 9.4.1 Swift 4 - Сравнение не примитивного набора с набором примитивов, содержащим Int - PullRequest
0 голосов
/ 06 декабря 2018

Я озадачен подходом к этому сценарию, так как не могу понять, как проверить, существует ли отдельное значение в каждом списке listGroup перед возвратом true, и если одно значение отсутствует в одном из 4 списков, которое должен вернуть funcfalse.

Вставленный список будет иметь структуру данных, содержащую идентификатор, имя, группу. Пример объекта, переданного в objList: Object - id: Int, name: String, group: String

init(){ 
    //contains value which will match objList id's
    let list1 : Set<Int> = [1,2] 
    let list2 : Set<Int> = [3,4] 
    let list3 : Set<Int> = [5,6,7] 
    let list4 : Set<Int> = [8,9]

    //Set of Sets
    listGroups = [list1,list2,list3,list4] 
}

func checklist(_ objList: [Details]) -> Bool { 
    //I want to check that each sub set(list1-list4) elements exist 
    //E.G. if objList contains 2, 3, 7, 8, 15, 21 it will return true 
    //and if objList contains 1, 4, 7, return false as it doesn't contain a  
    //number from each set 

    //How I thought to approach but became stuck
    for obj in objList {
        for set in listGroups {
            if set.contains(i.id){
                //return true if objList contains numbers from list1, list2, list3 and list4
            }
        }
    }
    //I require an id from each list to be present in the objList
    //but how would i know which set had which id and count how many group of 4 
    //there would be
}

"Детали", переданные через, содержат детали о них, однако я хочу проверить, существует ли Int в списке listGroups в переданном через objList.Однако функция может возвращать true только в том случае, если существует значение из каждого подмножества listGroups.

Должно присутствовать одно значение из всех 4 подмножеств, прежде чем я смогу вернуть true, и если один или несколькоотсутствует функция должна возвращать false

1 Ответ

0 голосов
/ 06 декабря 2018

Создайте Set из id значений itemList и используйте intersection, чтобы проверить, содержит ли один набор хотя бы один элемент из другого набора.

func checklist(_ objList: [Details]) -> Bool {
    let idSet = Set(objList.map{$0.id})

    for set in listGroups {
        if set.intersection(idSet).isEmpty { return false }
    }
    return true
}

Для очень длинногосписок может быть более эффективным вычесть текущие проверенные значения из idSet

func checklist(_ objList: [Details]) -> Bool {
   var idSet = Set(objList.map{$0.id})

    for set in listGroups {
        let commonSet = set.intersection(idSet)
        if commonSet.isEmpty { return false }
        idSet.subtract(set)
    }
    return true
}
...