2017-06-05 4 views
-2

Ich kann nicht herausfinden, wie ein Array mit einem Array zusammenpassen, und ich möchte so tun, dass wir nicht wissen, dass usersInData [0,1,2,3] ist dasselbe wie verifiedUsers [0,1,2,3], ich möchte irgendwie den gleichen Wert ohne Verwendung des Index jedes Arrays übereinstimmen.Einige Strings in einem Array entsprechen einem anderen Array

Ich versuchte this-

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"] 

if usersInData == verifiedUsers { 
    print("special user") 
} else { 
    print("regular user") 
} 

aber er druckt "normaler Benutzer", es also im Grunde nicht funktioniert. Ich möchte, dass die verifizierten Benutzer sich von den normalen Benutzern unterscheiden. So erhält zB der Benutzer "Hallo" ein speziell verifiziertes Icon usw. Danke!

+0

möglich duplicate von https://StackOverflow.com/questions/39161168/how-to-compare-two-array-of-objects und https://Stackoverflow.com/questions/36714522/how-do -i-check-in-swift-wenn-zwei-Arrays-enthalten-die-gleichen-Elemente-unabhängig-von-th –

+1

Wie ich aus Ihrer Frage verstehen kann, versuchen Sie, gemeinsame Werte herauszufinden. Recht? Wenn ja, erstelle zwei Sätze von zwei Arrays und finde deren Schnittpunkt. Schnittmenge wird Array zurückgeben. z.B. lass fruitsSet = Set (firstArray) lass vegSet = Setze (secondArray) lass output = Array (fruitsSet.intersect (vegSet)) –

Antwort

2

Ist etwas wie das, wonach Sie suchen?

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"] 

for user in usersInData { 
    if verifiedUsers.contains(where: { $0 == user }) 
     print("\(user) is a special user") 
    } else { 
     print("\(user) is a regular user") 
    } 
} 
0

Sie haben zu verwenden, die enthält: func enthält (_ Element: String) -> Bool. Leider vergleicht die Standardimplementierung dieser Funktion nur ein Element.

Sie müssen Array erweitern und func containsArray (array: [Element]) -> Bool erstellen.

Lassen Sie uns es tun:

extension Array where Element: Equatable { 
    func containsArray(array: [Element]) -> Bool { 
     return !array.contains { !self.contains($0) } 
    } 
} 

Wie es in Ihrem Code verwenden:

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"] 


if usersInData.containsArray(array: verifiedUsers) { 
    print("Special user") 
} else { 

    print("Regular user") 
} 
1

Ich bin mir nicht ganz sicher, was für hier Sie suchen.

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"] 

Wenn Sie wissen wollen, ob verifiedUsers und usersInData gemeinsam alle Elemente haben.

if !Set(verifiedUsers).isDisjoint(with: usersInData) { 
    print("special user") 
} else { 
    print("regular user") 
} 

Wenn Sie wissen wollen, ob jedes Element in verifiedUsers in ist usersInData

if Set(verifiedUsers).isSubset(of: usersInData) { 
    print("special user") 
} else { 
    print("regular user") 
} 

oder

if Set(usersInData).isSuperset(of: verifiedUsers) { 
    print("special user") 
} else { 
    print("regular user") 
} 

Wenn Sie wissen wollen, ob usersInData die enthält nach quence verifiedUsers, dann ist das ein bisschen Trickerei.

for i in usersInData.startIndex ..< usersInData.endIndex - verifiedUsers.count { 
    if verifiedUsers.elementsEqual(usersInData[i ..< i + verifiedUsers.count]) { 
     print("special user") 
     break 
    } 
} 

Ich bin sicher, es gibt eine bessere Antwort für das Subsequenzproblem.

UPDATE

von @iLandes API inspiriert, habe ich meine Teilfolge Test gewickelt.

extension Array where Element: Equatable { 
    func hasSubsequence(_ other: Array) -> Bool { 
     for i in startIndex ..< endIndex - other.count { 
      if other.elementsEqual(self[i ..< i + other.count]) { 
       return true 
      } 
     } 

     return false 
    } 
} 

if usersInData.hasSubsequence(verifiedUsers) { 
    print("special user") 
} else { 
    print("regular user") 
} 
0

Ich verstehe, dass Sie wissen möchten, welcher Wert in beiden Feldern vorhanden ist.

Wir können Sets verwenden, um sie zu finden, wie von Set Theory in Mathematik bekannt.

Was Sie suchen heißt Kreuzung - ein Element ist in beiden Satz von Elementen gefunden. Mathematische Notation: A ∩ B.

let usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 
let verifiedUsers = ["hello", "hello1", "hello2", "hello3", "hello1212"] 
let verifiedUsersInData = Array(Set(usersInData).intersection(verifiedUsers)) 
print(verifiedUsersInData) 

Ausgang:

["hello3", "hello", "hello2", "hello1"] 

Wie Sie können sich das Ergebnis Array eine andere Ordnung als die zwei Eingangs Array hat. Dies liegt daran, dass Sets kein Bestellkonzept haben.

wenn eine Aufrechterhaltung der Ordnung für Sie wichtig ist, haben Sie mehrere Möglichkeiten:

  • sortieren das Ergebnis-Array durch, um die Bestellung eines der Eingangs Arrays zu vergleichen,
  • die Werte in den Eingabefeldern umwickeln ein Typ, der einen Gewichtswert hat, bestellen, indem er das Ergebnis Array, als auszupacken,
  • Verwendung NSOrderedSet, die die Reihenfolge hält aber funktioniert nicht für eine schnelle Typen,
  • Online eine geordnete Menge Umsetzung finden. Ich habe keine Empfehlung für irgendwelche, aber Sie sollten eine auswählen, die verspricht, die gleichen BigO Eigenschaften zu haben, die wir von den Sätzen benutzen.
0
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"] 
    var verifiedUsers = ["hello", "hello1", "hello2", "hello3"] 

    for user in usersInData { 
     if verifiedUsers.contains(user){ 
     print("\(user) is a special user") 
    } else { 
     print("\(user) is a regular user") 
    } 
    } 

dies versuchen. es wird funktionieren

Verwandte Themen