我试图通过搜索列表
来查找项目索引
。有人知道怎么做吗?
我看到有列表。StartIndex和列表。EndIndex
但我想要类似python的列表的东西。索引(“文本”)
。
你可以过滤
带有闭包的数组:
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
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关于实现Equable
的class
类型的相关和有用的评论,其中您需要考虑是否应该使用==
(标识操作符)或==
(等号操作符)进行比较。如果您决定使用==
进行匹配,那么您可以简单地使用其他人建议的方法(people.firstIndex(of:人1)
)。
由于swift在某些方面比面向对象的更具功能性(数组是结构,而不是对象),因此使用函数“find”对数组进行操作,该函数返回一个可选值,因此请准备好处理nil值:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
使用firstIndex
和lastIndex
——这取决于您是在查找项目的第一个索引还是最后一个索引:
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循环,您也可以编写它: 现在,这没有什么特别的错误,但是请注意,这里的关键方面是索引,而不是值。索引是“循环”的输入和输出。 作为流: 产生输出: