let items: [String] = ["A", "B", "A", "C", "A", "D"]
items.whatFunction("A") // -> [0, 2, 4]
items.whatFunction("B") // -> [1]
Swift 3支持类似whatFunction(_: Element)
的函数吗?
如果不支持,最有效的逻辑是什么?
你可以直接过滤数组的indices
,这样可以避免额外的map
操作。
let items = ["A", "B", "A", "C", "A", "D"]
let filteredIndices = items.indices.filter {items[$0] == "A"}
或者作为Array
的扩展:
extension Array where Element: Equatable {
func whatFunction(_ value : Element) -> [Int] {
return self.indices.filter {self[$0] == value}
}
}
items.whatFunction("A") // -> [0, 2, 4]
items.whatFunction("B") // -> [1]
或者更加通用
extension Collection where Element: Equatable {
func whatFunction(_ value : Element) -> [Index] {
return self.indices.filter {self[$0] == value}
}
}
Collection
,因为实现并没有使用任何特定于数组的内容。 - Tim Vermeulen你可以为数组创建自己的扩展。
extension Array where Element: Equatable {
func indexes(of element: Element) -> [Int] {
return self.enumerated().filter({ element == $0.element }).map({ $0.offset })
}
}
你可以直接这样调用它
items.indexes(of: "A") // [0, 2, 4]
items.indexes(of: "B") // [1]
.enumerated()
是一个坏主意,因为它不保证是索引,正如苹果文档所述:“当您枚举集合时,每个对的整数部分是枚举的计数器,但不一定是配对值的索引。” - zero3nna通过如下步骤可以实现:
enumerated()
- 添加索引;filter()
- 过滤不必要的项目;map()
- 处理索引。示例(适用于 Swift 3 - Swift 4.x):
let items: [String] = ["A", "B", "A", "C", "A", "D"]
print(items.enumerated().filter({ $0.element == "A" }).map({ $0.offset })) // -> [0, 2, 4]
另一种方法是使用 flatMap
,它允许您在一个闭包中检查元素并返回索引。
示例(适用于 Swift 3 - Swift 4.0):
print(items.enumerated().flatMap { $0.element == "A" ? $0.offset : nil }) // -> [0, 2, 4]
但自从Swift 4.1以来,可以返回非零对象的flatMap
已被弃用,而应该使用compactMap
。
例如(可在Swift 4.1以上版本中使用):
print(items.enumerated().compactMap { $0.element == "A" ? $0.offset : nil }) // -> [0, 2, 4]
最干净、最省内存的方法是通过迭代数组 indices 并检查当前索引处的数组元素是否等于所需元素。
示例(适用于 Swift 3 - Swift 5.x):
print(items.indices.filter({ items[$0] == "A" })) // -> [0, 2, 4]
let items: [String] = ["A", "B", "A", "C", "A", "D"]
extension Array where Element: Equatable {
func indexes(of item: Element) -> [Int] {
return enumerated().compactMap { $0.element == item ? $0.offset : nil }
}
}
items.indexes(of: "A")
我希望我的回答对您有所帮助。
您可以这样使用:
let items: [String] = ["A", "B", "A", "C", "A", "D"]
let indexes = items.enumerated().filter {
$0.element == "A"
}.map{$0.offset}
print(indexes)
只需复制粘贴
extension Array {
func whatFunction(_ ids : String) -> [Int] {
var mutableArr = [Int]()
for i in 0..<self.count {
if ((self[i] as! String) == ids) {
mutableArr.append(i)
}
}
return mutableArr
}
}
var firstArray = ["k","d","r","r","p","k","b","p","k","k"]
var secondArray = ["k","d","r","s","d","r","b","c"]
let filterArray = firstArray.filter { secondArray.contains($0) }
let filterArray1 = firstArray.filter { !secondArray.contains($0) }
let filterIndex = firstArray.enumerated().filter { $0.element == "k" }.map { $0.offset }
print(filterArray) --> // ["k", "d", "r", "r", "k", "b", "k", "k"]
print(filterArray1) --> // ["p", "p"]
print(filterIndex) --> // [0, 5, 8, 9]
这也可以是一种方式
// MARK: - ZIP: Dictionary like
let words = ["One", "Two", "Three", "Four"]
let numbers = 1...words.count
for (word, number) in zip(words, numbers) {
print("\n\(word): \(number)")
}
let p_last = [51,42]
let inds1 = [1,3,51,42,4]
let idx1 = Array(inds1.filter{ p_last.contains($0) }.indices)
idx1 = [0,1]
index(of: Element)
只返回Int?
。我需要的函数应该返回[Int]?
。 - Byoth