【发布时间】: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