1

我的表格视图中有 2 个部分。Section 0具有来自数组的section 1数据并具有来自 api 的数据。现在我想检查来自的数据section 0是否具有匹配的数据,section 1然后我想从section 1. 不知道该怎么做……</p>

我有 2 个数组在每个部分中填充数据:

filteredSelectedProductList  —&gt; Section 0
productsList —&gt; Section 1

这是我的代码:

      if self.filteredSelectedProductList.isEmpty == false {
        for prod in self.filteredSelectedProductList {  //section 0
          for filtProd in productsList {   //section 1
            if prod.productId == filtProd.productId {
              //Here I want to remove the matching entry from productsList array. How can I do that..?

            }
          }
        }
      }
4

4 回答 4

1

斯威夫特 4.1

你可以这样做,你只需要放你的数组而不是这个

var array1 = ["45","34","67"] //section 0
var array2 = ["45", "23"] // section 1

array2.removeAll(where: { array1.contains($0) }) // finalArray = ["23"]
于 2019-04-04T10:49:54.740 回答
1

您可以使用removeAll

productsList.removeAll(where: { filteredSelectedProductList.contains($0) })

要使用包含,您的模型必须符合Equatable,否则您应该这样做:

productsList.removeAll(where: { item in filteredSelectedProductList.contains(where: { $0.productId == item.productId }) })
于 2019-04-04T10:52:28.003 回答
1

You can use filter where not contains,

something like this should work,

var arr1 = [1,3,4,5,6] // array 1 section 0
var arr2 = [2,34,5,6] // array 2 section 1

print(arr2.filter{!arr1.contains($0)}) // [2,34] 

In your case you are using custom model, you can confirm to Equatable and do the following with it, then you can simple use it as i showed you above.

struct MyCustomObject {
    var id: Int // some unique id you can compare things to
}

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

Usage :

var arra1: [MyCustomObject] = [] // section 0 
var arra2: [MyCustomObject] = [] // section 1 
print(arra2.filter{!arra1.contains($0)}) 
于 2019-04-04T10:48:11.010 回答
-1

Array.contains是一个O( n )操作。这意味着第一个数组中的每个元素,您可能必须搜索第二个数组中的所有元素。导致O( m * n )m并且n是数组的计数,效率不高。

更好的方法是:

  • 构建第一个数组中元素出现的字典,
  • 然后遍历第二个数组,
  • 附加第二个数组中不属于第一个数组的元素。

这是一个执行上述步骤的函数,时间复杂度为O( m + n )

func intersect<T: Hashable>(_ a1: [T], with a2: [T]) -> [T] {

    var result = [T]()
    result.reserveCapacity(a2.count)

    var dict1: [T: Int] = [T: Int].init(minimumCapacity: a1.count)

    for x in a1 {
        dict1[x, default: 0] += 1
    }

    for y in a2 {
        if dict1[y] == nil || dict1[y] == 0 {
            result.append(y)
        } else {
            dict1[y]! -= 1
        }
    }

    return result
}

请注意,数组的元素必须符合Hashable才能使用字典。如果元素在第二个数组中出现的次数比在第一个数组中出现的次数多,则多余的重复项是保留的。在所有其他答案中都没有处理

以下是一些用例:

let array1 = [1, 2, 3, 4, 5, 6]
let array2 = [1, 2, 2, 4, 7, 6]

intersect(array1, with: array2) //[2, 7]

struct MyStruct: Hashable { var id: Int }

let array3 = [MyStruct(id: 0), MyStruct(id: 2), MyStruct(id: 3)]
let array4 = [MyStruct(id: 1), MyStruct(id: 2), MyStruct(id: 2)]

intersect(array3, with: array4)  //[{id 1}, {id 2}]
于 2019-04-04T12:55:41.987 回答