2015-12-10 1 views
0

J'ai trouvé this question answered here concernant l'intersection de deux tableaux. Que faire si je veux savoir ce qu'il y a de commun entre plus de deux tableaux d'objets? Que faire si je ne sais pas combien de tableaux il y aura?Intersection de plus de 2 ensembles de tableaux?

MISE À JOUR:

Voici mon code et tenter de recouper un certain nombre de tableaux inconnus, mais je ne peux obtenir jusqu'à deux tableaux dans ce scénario avant d'avoir à se soucier de l'indice de problèmes de portée et ensembles perdre dans la prochaine boucle autour. J'ai pensé à les stocker dans des variables temporaires en boucle, mais je ne suis pas sûr que ce soit la meilleure solution.

//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) 
     } 
    } 

MISE À JOUR 2

La réponse finale est une combinaison de la réponse de Phillip ci-dessous et le code que je suis commentaire ici. Cela répond à la question "Et si vous ne savez pas combien de réseaux il y aura?"

L'astuce consistait à définir et à initialiser un ensemble temporaire pour l'intersection dans le tour suivant dans la boucle. Je devais l'initialiser sinon il ne me laisserait pas l'utiliser.

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

Vous pouvez continuer à recouper avec le résultat de l'opération précédente. À un certain moment, vous devez savoir combien vous avez ou, au moins, si vous en avez un autre. –

+0

Oh je pensais que le résultat était une chaîne ... –

Répondre

1

Essayez ceci dans une aire de jeux et inspectez le type de inter de données:

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

Je vais essayer, mais j'essaie toujours de comprendre comment je fais cela dans une situation où le nombre de tableaux sera inconnu. –

+0

Pouvez-vous expliquer cela? Je peux voir comment vous pourriez ne pas savoir à l'avance, mais, en cours d'exécution, vous devez savoir si vous avez un autre tableau à traiter. –

+0

Voir ma mise à jour/modifier. Cela aura plus de sens. –