当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中查找列表项的索引?

乜坚成
2023-03-14

我试图通过搜索列表来查找项目索引。有人知道怎么做吗?

我看到有列表。StartIndex和列表。EndIndex但我想要类似python的列表的东西。索引(“文本”)

共有3个答案

朱睿
2023-03-14

你可以过滤带有闭包的数组:

var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 }  // <= returns [3]

你可以数一个数组:

filtered.count // <= returns 1

因此,您可以通过组合以下各项来确定数组是否包含您的元素:

myList.filter { $0 == 3 }.count > 0  // <= returns true if the array includes 3

如果你想找到这个职位,我看不出什么好办法,但你肯定可以这样做:

var found: Int?  // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
    if x[i] == 3 {
        found = i
    }
}

编辑

当我们在做的时候,为了一个有趣的练习,让我们扩展Array来拥有一个search方法:

extension Array {
    func find(includedElement: T -> Bool) -> Int? {
        for (idx, element) in enumerate(self) {
            if includedElement(element) {
                return idx
            }
        }
        return nil
    }
}

现在我们可以做到:

myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found

卫增
2023-03-14

tl;博士:

对于类,您可能正在寻找:

let index = someArray.firstIndex{$0 === someObject}

完整答案:

我认为值得一提的是,对于引用类型(class),您可能希望执行标识比较,在这种情况下,您只需要在谓词闭包中使用==标识运算符:

Swift 5、Swift 4.2:

let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")

let people = [person1, person2, person3]

let indexOfPerson1 = people.firstIndex{$0 === person1} // 0
let indexOfPerson2 = people.firstIndex{$0 === person2} // 1
let indexOfPerson3 = people.firstIndex{$0 === person3} // 2
let indexOfPerson4 = people.firstIndex{$0 === person4} // nil

请注意,上述语法使用尾部闭包语法,相当于:

let indexOfPerson1 = people.firstIndex(where: {$0 === person1})


Swift 4/Swift 3-用于调用index的函数

Swift 2-用于调用indexOf
的函数

*注意paulbailey关于实现Equableclass类型的相关和有用的评论,其中您需要考虑是否应该使用==(标识操作符)或==(等号操作符)进行比较。如果您决定使用==进行匹配,那么您可以简单地使用其他人建议的方法people.firstIndex(of:人1))。

阎功
2023-03-14

由于swift在某些方面比面向对象的更具功能性(数组是结构,而不是对象),因此使用函数“find”对数组进行操作,该函数返回一个可选值,因此请准备好处理nil值:

let arr:Array = ["a","b","c"]
find(arr, "c")!              // 2
find(arr, "d")               // nil

使用firstIndexlastIndex——这取决于您是在查找项目的第一个索引还是最后一个索引:

let arr = ["a","b","c","a"]

let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
 类似资料:
  • 问题内容: 我正在尝试通过搜索找到一个。有人知道该怎么做吗? 我看到了,但是我想要类似python的东西。 问题答案: 由于Swift在某些方面要比面向对象的功能更强大(并且Array是结构而不是对象),因此请使用“ find”函数对数组进行操作,该数组将返回可选值,因此请准备处理nil值: Swift 2.0更新: Swift 2.0不再支持旧功能! 使用Swift 2.0,可以使用扩展中定义的

  • 问题内容: 我有一个清单清单: 搜索列表并返回其中一项的位置的最干净方法是什么? 我已经看过该方法,但是似乎并没有在列表中解压缩列表。 给出:,不是我所期望的… 问题答案: 我会做这样的事情: 这将返回一个元组列表,其中第一个索引是第一个列表中的位置,第二个索引是第二个列表中的位置(注意:您要查找的颜色,即)。 对于问题中的示例,返回值为: 如果您只需要懒惰地找到找到颜色的第一个位置,则可以使用以

  • 问题内容: 我很新,我希望它不太明显,但是我似乎无法为以下问题找到一个简短而准确的答案。 我有两个清单: 我想查找第二个列表()的所有索引何时在第一个列表()中,以便得到如下内容: b在a中的索引:或 问题答案: 具有列表理解: 或使用for循环:

  • 问题内容: 如果要尝试在列表中查找某项的索引,则可以采用几种不同的方法来完成,这就是我所知道的最快的方法 另一种方式不是pythonic且速度较慢 第一种方法无疑是更快的方法,但是如果您想更快地进行操作,那该怎么办呢?对于第一个索引使用方法 速度很快,但无法处理多个索引如何加快速度? 问题答案: 假设您想要一个列表作为输出:对于我的测试,所有选项似乎都表现出相似的时间性能,列表理解最快(几乎没有)

  • 我知道总是打印第一次出现的索引。我如何打印所有的索引?

  • 问题内容: 我正在尝试使用Java 8流和lambda表达式进行顺序搜索。这是我的代码 我知道总是打印第一次出现的索引。如何打印所有索引? 问题答案: 首先,使用Lambdas并不是解决所有问题的方法…但是,即使如此,作为for循环,您也可以编写它: 现在,这没有什么特别的错误,但是请注意,这里的关键方面是索引,而不是值。索引是“循环”的输入和输出。 作为流: 产生输出: