2016-08-26 24 views
7

Mam Klasa A:Jak porównać dwie tablice obiektów?

class A { 
    var identifier: String? 
    var quantity: Int = 0 
} 

Dwie macierze A przypadkach:

var array1: [A] = [a1, a2, a3, a4] 
var array2: [A] = [a5, a6, a7, a8] 

nie wiem, co jest najlepszym sposobem, aby sprawdzić: array1==array2 if a1.identifier == a5.identifier, a2.identifier == a6.identifier, a3.identifier==a7.identifier, a4.identifier==a8.identifier w Swift.

Proszę mi pomóc ...

+0

tablica1 i tablica2 zawsze być tego samego rozmiaru? pokaż liczbę tablic być również sprawdzić? lub sprawdź czy na właściwości każdego elementu w tablicach? – ddb

+0

@ddb: Przepraszam, ich liczba jest przypadkowa –

+0

, więc jeśli mają różne liczby, powinny być sklasyfikowane jako nierówne, prawda? – ddb

Odpowiedz

7

Załóżmy dane tak:

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

    var people1 = [ 
     Person(name: "Quang Hà", id: 42), 
     Person(name: "Lý Hải", id: 23), 
     Person(name: "Maria", id: 99) 
    ] 

    var people2 = [ 
     Person(name: "Maria yyy", id: 99), 
     Person(name: "Billy", id: 42), 
     Person(name: "David", id: 23) 
    ] 

Jest to metoda, aby porównać dwie tablice ludzi z ID:

func areArrayPeopleEqual(people1:[Person], people2: [Person]) -> Bool { 
    var array1 = people1 
    var array2 = people2 

    // Don't equal size => false 
    if array1.count != array2.count { 
     return false 
    } 

    // sort two arrays 
    array1.sortInPlace() { $0.id > $1.id } 
    array2.sortInPlace() {$0.id > $1.id } 

    // get count of the matched items 
    let result = zip(array1, array2).enumerate().filter() { 
     $1.0.id == $1.1.id 
     }.count 

    if result == array1.count { 
     return true 
    } 

    return false 
} 
15

Możesz spróbować tak:

let result = zip(array1, array2).enumerate().filter() { 
    $1.0 == $1.1 
}.map{$0.0} 
+2

wow. Stałem się twoim fanem. –

1

spróbuj tego kodu, daj mi znać, jeśli działa

func toDictionary<E, K, V>(
    array:  [E], 
    transformer: (element: E) -> (key: K, value: V)?) 
    -> Dictionary<K, V> 
{ 
    return array.reduce([:]) { 
     (var dict, e) in 
     if let (key, value) = transformer(element: e) 
     { 
      dict[key] = value 
     } 
     return dict 
    } 
} 

następnie można wykonać test jak poniżej:

let areEqual = array1.count == array2.count; 
if areEqual { 
    let dict1 = toDictionary(array1) { ($0.identifier, $0.quantity) } 
    let dict2 = toDictionary(array2) { ($0.identifier, $0.quantity) } 
    areEqual = NSDictionary(dictionary: dict1).isEqualToDictionary(dict2) 
} 
print(areEqual) 

Uwaga: Funkcja toDictionary został wziął formularz here

1

Najpierw wyciągamy Equatable klasę, aby mieć DRY kodu, niż wtedy, gdy 2 tablice są zawsze tej samej wielkości, lub jeśli przynajmniej pierwszy z nich jest < = niż sekunda, którą możesz zastosować z tym rozwiązaniem.

Zwróć uwagę, że pracujesz z opcjami, być może będziesz musiał je wcześniej rozpakować.

class A { 
    var identifier: String? 
    var quantity: Int = 0 

    init(identifier: String, quantity: Int) { 
     self.identifier = identifier 
     self.quantity = quantity 
    } 
} 

let a1: A = A(identifier: "1", quantity: 1) 
let a2: A = A(identifier: "2", quantity: 2) 
let a3: A = A(identifier: "3", quantity: 3) 
let a4: A = A(identifier: "4", quantity: 4) 

let a5: A = A(identifier: "1", quantity: 1) 
let a6: A = A(identifier: "2", quantity: 2) 
let a7: A = A(identifier: "3", quantity: 3) 
let a8: A = A(identifier: "4", quantity: 4) 

var array1: [A] = [a1, a2, a3, a4] 
var array2: [A] = [a5, a6, a7, a8] 

func areEquals(array1: [A], array2: [A]) -> Bool { 
    if array1.count < array2.count { 
     return false 
    } 
    for i in 0...array2.count - 1 { 
     if array1[i] != array2[i] { 
      return false 
     } 
    } 
    return true 
} 


extension A: Equatable { 
    static func ==(lhs: A, rhs: A) -> Bool { 
     //you can choose how and when they should be equals 
     return lhs.identifier == rhs.identifier 
    } 
} 

Proof of working

Powiązane problemy