2017-06-05 20 views
-2

配列の一部が配列全体と一致する方法を理解できず、われわれがusersInData [0,1,2,3]確認されたユーザー[0,1,2,3]と同じです、私は何とか各値のインデックスを使わずに同じ値に一致させたいと思います。配列内の一部の文字列が別の配列と一致する

私は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") 
} 

を試してみましたが、それは "通常のユーザ" を印刷し、その基本的には動作しませんでした。 確認されたユーザーを通常のユーザーと異なるものにします。だから、例えば、ユーザー "こんにちは"特別な確認アイコンなどを取得します。ありがとう!

+0

可能な複製https://stackoverflow.com/questions/39161168/how-to-compare-two-array-of-objectsとhttps://stackoverflow.com/questions/36714522/how-do -i-check-in-two-arrays-if-two-arrays-same-elements-th-of-thを含む –

+1

あなたの質問から理解できるように、あなたは共通の値を見つけようとしています。右?もしそうなら、与えられた2つの配列から2つのセットを作成し、それらの交差を見つけます。交点集合は配列を返す。例えばlet fruitsSet = Set(firstArray) let vegSet =セット(secondArray) let output = Array(fruitsSet.intersect(vegSet)) –

答えて

2

あなたの後ろのものは何ですか?

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

contains:func contains(_要素:String) - > Boolを使用する必要があります。残念ながら、この関数のデフォルトの実装は1つの要素だけを比較します。

Arrayを拡張して関数containsArray(array:[Element]) - > Boolを作成する必要があります。

のは、それをやってみましょう:

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

はあなたのコードでそれを使用する方法:

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

私はあなたのここを探しているものをかなりよく分かりません。

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

あなたはverifiedUsersusersInDataは共通で任意の要素を持っているかどうかを知りたい場合。

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

あなたはusersInDataが含まれているかどうかを知りたい場合はverifiedUsers内のすべての要素がusersInData

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

または

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

であるかどうかを知りたい場合は分泌するの場合は、ちょっとトリッキーです。

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

サブシーケンスの問題については、より良い答えがあると確信しています。 @iLandesのAPIに触発

UPDATE

、私は私のサブテストを包ん追加。

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

いずれの値が両方の配列に存在するかを知りたいと思います。

数学では​​から知られているように、Setsを使用してそれらを見つけることができます。

交差点 - 要素は両方の要素セットにあります。数学的記法: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) 

出力:

結果の配列は、2つの入力配列よりも別の注文を持っていることができますSEとして
["hello3", "hello", "hello2", "hello1"] 

。これは、セットには発注の概念がないためです。

秩序を維持することはあなたのために重要であるならば、あなたはいくつかのオプションがあります:

  • 入力配列のいずれかに順序を比較することで、ソート結果の配列、
  • は、入力配列内の値をラップ包みを開けるよりも、重み値を持っているタイプは、オンライン注文設定の実装を見つけ、それによって順序を保持しますが、迅速なタイプのために働いていない
  • 使用NSOrderedSet
  • を結果配列を注文します。私には何の推薦もありませんが、セットから使用されているのと同じBigO特性を持つことを約束するものを選ぶべきです。
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") 
    } 
    } 

これを試してください。それは動作します

関連する問題