_let items: [String] = ["A", "B", "A", "C", "A", "D"]
items.whatFunction("A") // -> [0, 2, 4]
items.whatFunction("B") // -> [1]
_
Swift 3はwhatFunction(_: Element)
のような関数をサポートしますか?
そうでない場合、最も効率的なロジックは何ですか?
配列用に独自の拡張機能を作成できます。
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]
配列のindices
を直接フィルタリングすることができ、余分なmap
pingを回避します。
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}
}
}
これは、次のチェーンで実現できます。
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
を使用することです。これにより、1つのクロージャーで必要に応じて要素をチェックし、インデックスを返すことができます。
例(Swift 3-Swift 4.0)で動作します):
print(items.enumerated().flatMap { $0.element == "A" ? $0.offset : nil }) // -> [0, 2, 4]
ただし、Swift 4.1 flatMap
がnil以外のオブジェクトを返す可能性があるため、推奨されないため、代わりに compactMap
を使用する必要があります。
例(Swift 4.1以降)
print(items.enumerated().compactMap { $0.element == "A" ? $0.offset : nil }) // -> [0, 2, 4]
そして、最もクリーンでメモリを節約する方法は、配列 indices を反復処理し、現在のインデックスの配列の要素が必要な要素と等しいかどうかを確認することです。
例(Swift 3-Swift 4.x)で動作します):
print(items.indices.filter({ items[$0] == "A" })) // -> [0, 2, 4]
SwiftおよびSwift 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
}
}
たとえば、inds1配列にあるp_last値のインデックスを見つける:(Swift 4+)
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]