2016-12-15 16 views
1

「Person」クラスのインスタンスの配列が2つあるとします。クラスPersonには、 "name"、 "age"、 "id"というプロパティがあります。 "id"は一意の識別子なので、人の比較に使用できます。だから、 、私は人々の二つの配列を持っていると言う:オブジェクトのプロパティに基づいてオブジェクトの2つの配列を減算する

[ {Name: Bob,Age: 18,ID: 142353}, {Name: Rob, Age: 40,ID: 142350}, {Name: Andy, Age: 30,ID: 142359}, {Name: Andy, Age: 21,ID: 142340} ] 

[ {Name: Jack,Age: 18,ID: 142362}, {Name: James, Age: 40,ID: 142311}, {Name: Rob, Age: 40,ID: 142350}, {Name: Andy, Age: 21,ID: 142340} ] 

私は、アレイ2のそれからアレイ1が異なっていること、人のIDを比較し、それらを取得したいので、結果は次のようになります。

[{Name: Bob,Age: 18,ID: 142353}, {Name: Andy, Age: 30,ID: 142359}] 

私はスウィフト、今これをやっている方法は次のとおりです。

let new = newPeople.filter({ p1 in 
         previousPeople.contains(where: { p2 in 
          p1.id != p2.id 
     }) 
    }) 

しかし、私はこれが働いているとは思いません。私の実装で何が間違っているのか分からない。

+0

!previousPeopleで(http://stackoverflow.com/questions/40263697/merge-arrays-with-condition)[条件付き配列をマージ] – JPetric

+3

'せて新しい= newPeople.filter({P1の可能性のある重複.contains(どこで:{p2 in p1.id == p2.id})}) ' – courteouselk

+0

どこでも'} 'を避けるために末尾の閉じた構文を使用してください – Alexander

答えて

2

PersonクラスをEquatableプロトコルに準拠させたいとします。

extension Person: Equatable { 
    static func ==(lhs: Person, rhs: Person) -> Bool { 
     return lhs.id == rhs.id 
    } 
} 

、あなたは、2つの配列の単純なフィルタ行うことができます。

let person1 = Person(name: "J", age: 20, id: UUID()) 
let person2 = Person(name: "K", age: 40, id: UUID()) 
let person3 = Person(name: "L", age: 30, id: UUID()) 
let person4 = Person(name: "M", age: 25, id: UUID()) 
let person5 = Person(name: "N", age: 39, id: UUID()) 

let personArray1 = [person1, person2, person3] 
let personArray2 = [person4, person2, person3] 

let filteredPersonArray = personArray1.filter { !personArray2.contains($0) } 
//filteredPersonArray.count == 1 which is person4 
+0

あなたの圧痕は全面にありました。私はあなたのためにそれを編集し、修正しました。 – Alexander

+1

偉大な答えが、私はあなたがセットを使用することをお勧めします。 – Alexander

+0

ありがとう、アレクサンダー、私はまだ書式設定のハングを取得しています。セットとの良い提案、私はそれを考えなかった。 – JustinM

0

をあなたが保持しないIDのSetを作成し、これに対してcontainsをチェックすることによって、あなたの人々をフィルタリングSet 。あなたはArrayのIDをpeople.map{ $0.id }を使用してArray人から入手できます。

struct Person { 
    let name: String 
    let age: Int 
    let id: Int 
} 

let people1 = [ 
    Person(name: "Bob", age: 18, id: 142353), 
    Person(name: "Rob", age: 40, id: 142350), 
    Person(name: "Andy", age: 30, id: 142359), 
    Person(name: "Andy", age: 21, id: 142340) 
] 

let people2 = [ 
    Person(name: "Jack", age: 18, id: 142362), 
    Person(name: "James", age: 40, id: 142311), 
    Person(name: "Rob", age: 40, id: 142350), 
    Person(name: "Andy", age: 21, id: 142340) 
] 


let undesiredIDs = Set(people2.map{ $0.id }) 
print("Keeping all people that don't have one of these IDs: \(undesiredIDs)\r\n\r\n") 

let filteredPeople = people1.filter{ !undesiredIDs.contains($0.id) } 

print("Original list: \(people1).\r\n\r\n") 
print("Filtered: \(filteredPeople)") 
関連する問題