【问题标题】:Find an object in Swift Array which has the same object multiple times in it在 Swift Array 中查找一个对象,其中多次包含相同的对象
【发布时间】:2018-09-15 16:47:37
【问题描述】:

我正在为 Swift 的 Arrays 寻找 - [NSArray indexOfObject:inRange:] 的替代品。我想要做的基本上是:

NSArray *A = @[@1, @3, @5, @4, @3];
NSUInteger cursor = 0;
while (YES) {
    NSUInteger res = [A indexOfObject:@3 inRange:NSMakeRange(cursor, A.count - cursor)];
    if (res == NSNotFound) {
        break;
    }
    NSLog(@"found 3 at %@", @(res));
    cursor = res + 1;
}

但我似乎找不到使用 Swift Array 从某个索引开始搜索的方法。我当然可以制作子数组,但是在 Swift 中有没有更好的方法呢?

【问题讨论】:

    标签: arrays swift swift3


    【解决方案1】:

    数组切片是解决这个问题的自然方法:

    let numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3]
    let range = 4...6
    let desiredNumber = 2
    let indexOfDesiredNumberInRange = numbers[range].index(of: desiredNumber)
    
    print(indexOfDesiredNumberInRange as Any) // => Optional(4)
    

    由于ArraySlice 只是查看源Array 的同一个后备存储,因此不会进行浪费性的复制

    【讨论】:

    • 感谢您的快速回复!是的,这就是我一直在寻找的。没有意识到 ArraySlice 只是原始 Array 的一个视图:)
    • @taichino 直到在 Array 或 ArraySlice 中完成突变为止。此时,会制作一个副本以保留其他别名的不变性:repl.it/repls/WhitesmokeDismalFlash
    【解决方案2】:

    我假设您正在尝试获取您正在寻找的对象的所有索引。这是一个更好的方法

    let arr = [1,2,3,4,3,5,6,7,8]
    
    for (num, index) in test.enumerated() {
        if num == 3 {
            print("found 3 at \(index)")
        }
    }
    

    另一种为您提供索引的方式:

    arr.enumerated().filter { (_, num) -> Bool in
        num == 3
    }.map { $0.offset }
    

    【讨论】:

    • @Alexander 这就是他的全部代码正在做的事情
    • 感谢@Simon 的快速回复!我正要照你说的做,但想知道是否有更好的方法。很抱歉,我在问题中的代码也令人困惑......
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多