2017-11-08 3 views
0

Func zu sehen, ob zwei Arrays einige gleiche Werte haben:Tupel von Array von Tupeln

func hasAllSame(largeCombinedArry:[Int], wantToKeep: [Int])->Bool{ 
    var howManySame = [Int]() 
    for intElement in largeCombinedArry{ 
     if wantToKeep.contains(intElement){ 
     howManySame.append(intElement) 
     } 
    } 
    howManySame.sort() 
    if wantToKeep == howManySame{ 
     print("These are the same!") 
     return true 
    } 
    else{ 
     print("These are NOT same!") 
     return false 
    } 
} 

Array von Tupeln wie folgt erklärt:

var TuplesArry:[(score: Double, value: [Int])] = [] 

Array thusly gefüllt:

for (arry1, score) in zip(arryOfArrays, AllScores) { 
    let calculatedDiff = otherValue - score 
    TuplesArry.append((score: calculatedDiff, value: arry1)) 
} 

var arrayForComparison = [8,9,7,6] 
arrayForComparison.sort() 

Fehler tritt hier nach mehreren Iterationen beim Funktionsaufruf hasAllSame()

auf
for i in 0..<TuplesArry.count{ 
    if hasAllSame(largeCombinedArry: TuplesArry[i].value, wantToKeep:                 
    arrayForComparison){ 
     //do nothing   
    } 
    else{ 
     /* 
     want to remove tuple that does not have all elements that are 
     in arrayForComparison 
     */ 
     TuplesArry.remove(at: i)      
    } 
} 

scheint Dieser Code zu arbeiten, aber es scheint, wie tuplesArry.count weiter abnimmt und iterator i, bis Fehler weiter erhöhen „out of range fatal Index“ tritt

Mein Ziel ist es, ein Tupel zu entfernen das Array von Tupeln, wenn der Wert die Kriterien nicht erfüllt.

Ich habe auch so etwas wie versucht:

for tuple in TuplesArry{ 
    if hasAllSame(largeCombinedArry: tuple.value, wantToKeep: 
    arrayForComparison){ 
      //do nothing 
    } 
    else{ 
     //this does NOT work 
     let index = TuplesArry.index(of:tuple) 
     TuplesArry.remove(at: index) 
    } 
} 
+0

Bitte beachten Sie diesen Hinweis in der Language Guide: * Tupeln nützlich sind für temporäre Gruppen verwandter Werte. Sie sind nicht für die Erstellung komplexer Datenstrukturen geeignet. Wenn Ihre Datenstruktur wahrscheinlich über einen temporären Bereich hinaus bestehen bleibt, modellieren Sie sie als Klasse oder Struktur und nicht als Tupel. * – vadian

+0

@vadian Ich habe dies berücksichtigt und als Klasse implementiert. Danke für Ihre Rückmeldung – Ranfan

Antwort

0

Das unmittelbare Problem ist, dass Sie in umgekehrter Reihenfolge zu durchlaufen müssen den „Index out of range“ Problem zu vermeiden.

Die viel einfachere Lösung ist filter auf Ihrem Array zu verwenden. Dann können Sie ganze for Schleife kann ersetzt werden durch:

TouplesArry = TouplesArry.filter { hasAllSame(largeCombinedArry: $0.value, wantToKeep: arrayForComparison) }