web-dev-qa-db-ja.com

Swift-配列のフィルターされたアイテムのインデックスを取得する方法

_let items: [String] = ["A", "B", "A", "C", "A", "D"]

items.whatFunction("A") // -> [0, 2, 4]
items.whatFunction("B") // -> [1]
_

Swift 3はwhatFunction(_: Element)のような関数をサポートしますか?

そうでない場合、最も効率的なロジックは何ですか?

19
Byoth

配列用に独自の拡張機能を作成できます。

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]
14
Yannick

配列のindicesを直接フィルタリングすることができ、余分なmappingを回避します。

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}
    }

}
21
vadian

これは、次のチェーンで実現できます。

  1. enumerated()-インデックスを追加します。
  2. filter()は不要なアイテムを出力します。
  3. 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]
11
pacification

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")

私の答えがお役に立てば幸いですか????

8
Julien Kode

あなたはそのように使うことができます:

 let items: [String] = ["A", "B", "A", "C", "A", "D"]

        let indexes = items.enumerated().filter {
            $0.element == "A"
            }.map{$0.offset}

        print(indexes)
2

コピーして貼り付けてください

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 
  }

}
1
sejal thesiya

たとえば、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]

0
bretcj7