【问题标题】:Swift Arrays: Keeping the order while filtering an array using anotherSwift Arrays:在使用另一个数组过滤数组时保持顺序
【发布时间】:2018-12-21 19:56:49
【问题描述】:

我有一个数组作为数字列表。在另一个较小的数组中,我保存了一些数字(以不同的顺序),我想使用第二个数组中的值过滤我的第一个数组。

我的数组:

let allNumbers = [50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200]
let someNumbers = [100, 90, 120, 200] // unordered

当我使用filter 方法或遍历第一个数组的值时,我可以获得正确的值,但元素的顺序与我的第二个数组不同,而是第一个 - 自然地。

方法一:filter方法,输单

let filtered = allNumbers.filter { someNumbers.contains($0) } // Runs 17 times
print(filtered) // "[90, 100, 120, 200]" (wrong order)

方法二:循环遍历第一个数组,丢失顺序

var filteredWithLoop: [Int] = []
for number in allNumbers { // Runs 16 Times
    if someNumbers.contains(number) {
        filteredWithLoop.append(number)
    }
}
print(filteredWithLoop) // "[90, 100, 120, 200]" (wrong order)

Hack:我可以通过在循环第二个数组时过滤第一个数组来解决这个问题,如下所示:

var filteredUglyWay: [Int] = []
for number in someNumbers {
    if let alone = (allNumbers.filter { $0 == number }).first { // Runs 4 * 16 Times
        filteredUglyWay.append(alone)
    }
}
print(filteredUglyWay) // "[100, 90, 120, 200]" (correct order)

但这对我来说更像是一种 hack,而不是一种解决方案,特别是考虑到循环式过滤器方法是在循环中调用的。

有没有更好的方法或者这就是它应该的方式?

重要提示:第一个数组实际上是为了让情况更容易理解的表示。在我的实际实现中,第一个数组包含一些对象,第二个数组只是一些对象的 ID 列表(如用户的收藏夹),所以每次我获取整个数据时,我都试图根据这个过滤最喜欢的对象身份证。

【问题讨论】:

  • Method1/2,把两个数组取反怎么样? let filtered = someNumbers.filter { allNumbers.contains($0) }
  • Line1: let combine = zip(self.leavelistdatearr, self.leavelistnamearr).sorted {$0.0
  • @Larme 编辑问题,第一个数组实际上是一个表示。在我的代码中,它包含一些自定义对象而不是普通数字,所以我试图根据我的第二个(比如说收藏夹)数组过滤这些对象。
  • @Larme 为了满足 Swift 4 的编译器,其实是这样的:let final = filtered.sorted(by: { someNumbers.index(of: $0)! < someNumbers.index(of: $1)! })。感谢您的想法,您能否将其发布为答案以便我批准?

标签: ios arrays swift loops filtering


【解决方案1】:

一个可能的解决方案: 过滤,然后排序。

let filtered = allNumbers.filtered({ someNumbers.contains($0) })
let filteredAndSorted = filtered.sorted(by: { someNumbers.index(of: $0)! < someNumbers.index(of: $1)! })

附注,由于filtered 仅由someNumbers 中的数据组成,因此前展开不应造成崩溃。

【讨论】:

    【解决方案2】:

    为什么不尝试更新的方法 2

    方法 2 已更新:循环遍历第二个数组

    var filteredWithLoop: [Int] = []
        for number in someNumbers { // Runs 4 Times
            if allNumbers.contains(number) {
                filteredWithLoop.append(number)
            } // IF OBJECT IS NOT THERE IN FIRST ARRAY IT WILL BE AUTOMATICALLY DISCARDED
        }
        print(filteredWithLoop) // "[100, 90, 120, 200]" (proper order)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      相关资源
      最近更新 更多