2015-12-10 3 views
0

Я нашел this question answered here относительно пересечения двух массивов. Что, если я хочу узнать, что общего между более чем двумя массивами предметов? Что, если я не знаю, сколько там будет массивов?Пересечение более 2 наборов массивов?

UPDATE:

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

//anyArray is an array of string arrays containing 
    //the items I want to intersect 

    let count = anyArray.count - 1 
    //var temp: Array<String> 

    for index in 0...count { 
     let item1 = anyArray[index] as! Array<String> 
     if index < count { 
      let item2 = anyArray[index + 1] as! Array<String> 
      let set1 = Set(item1) 
      let set2 = Set(item2) 
      let inter = set1.intersect(set2) 
      print(inter) 
     } 
    } 

UPDATE 2

Окончательный ответ был комбинацией ответ Филиппа ниже и кода я отправляю здесь. Это отвечает на вопрос «Что, если вы не знаете, сколько массивов будет?»

Хитрость заключалась в установке и инициализации временного набора для пересечения в следующем раунде в цикле. Я должен был инициализировать его, иначе он не позволил бы мне его использовать.

let count = anyArray.count - 1 
var inter = Set<String>() 

for index in 0...count { 
    if index == 0 { 
     let item1 = anyArray[index] as! Array<String> 
     let item2 = anyArray[index + 1] as! Array<String> 
     let set1 = Set(item1) 
     let set2 = Set(item2) 
     inter = set1.intersect(set2) 

    } else { 
     if index < count { 
      let item = anyArray[index + 1] as! Array<String> 
      inter = inter.intersect(item) 
     } 
    } 
} 

print(inter) 
+0

Вы можете продолжить до пересечения с результатом предыдущей операции. В какой-то момент вы должны знать, сколько у вас есть или, по крайней мере, есть ли у вас другой. –

+0

О, я думал, что результатом была строка ... –

ответ

1

Попробуйте это в детской площадке и проверить тип данных inter:

let a1: Array = [1, 1, 2, 3, 5, 8] 
let a2: Array = [1, 2, 3, 4, 5] 
let a3: Array = [1, 2, 4, 8, 16] 

let anyArray = [a1, a2, a3] 

var inter = Set(anyArray[0]) 

for idx in 1 ..< anyArray.count { 
    inter = inter.intersect(anyArray[idx]) 
} 

print("\(inter)") 
+0

Я попробую это, но все еще пытаюсь понять, как я это делаю в ситуации, когда количество массивов будет неизвестно. –

+0

Можете ли вы это объяснить? Я вижу, как вы могли бы не знать заранее, но во время работы вы должны знать, есть ли у вас другой массив для обработки. –

+0

См. Мое обновление/изменение. Это будет иметь больше смысла. –

Смежные вопросы