Swift Algorithm を使おう #3

Swift

Swift Algorithmsとは 2020年にAppleが公開したオープンソースパッケージで、順序とコレクションに関する便利なアルゴリズムを提供してくれます。

GitHub - apple/swift-algorithms: Commonly used sequence and collection algorithms for Swift
Commonly used sequence and collection algorithms for Swift - GitHub - apple/swift-algorithms: Commonly used sequence and collection algorithms for Swift

利用するにはSwift Package Managerで https://github.com/apple/swift-algorithms をプロジェクトに追加し、使用したいファイルにimport Algorithmsを追記してください。

できること

前回に引き続き、このパッケージでできることを説明していきます。

Random Sampling

シーケンスまたはコレクションからランダムにに要素を選択する操作。

var source = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

source.randomSample(count: 4)
// e.g. [30, 10, 70, 50]
source.randomStableSample(count: 4)
// e.g. [20, 30, 80, 100]
Indexed

zip()メソッドみたいなものですが、各要素をインデックスとペアリングする操作。

let numbers = [10, 20, 30]
for (i, n) in indexed() {
    print("\(i) : \(n)")
}
// 0 : 10
// 1 : 20
// 2 : 30
Partition

コレクションに対して指定した条件に合致するパーティションインデックスを見つける操作。

ただし、コレクションの順番は保証されない。

var numbers = [10, 20, 30, 40, 50, 60, 70, 80]
let p1 = numbers.partition(by: { $0.isMultiple(of: 20) })
// p1 == 4
// numbers == [10, 70, 30, 50, 40, 60, 20, 80]

コレクションの順番を保持したい場合は stablePartition を使用する。

numbers = [10, 20, 30, 40, 50, 60, 70, 80]
let p2 = numbers.stablePartition(by: { $0.isMultiple(of: 20) })
// p2 == 4
// numbers == [10, 30, 50, 70, 20, 40, 60, 80]
Rotate

コレクションの要素を新しい位置に回転させる処理。

var numbers = [10, 20, 30, 40, 50, 60]
let p = numbers.rotate(toStartAt: 2)
// numbers == [30, 40, 50, 60, 10, 20]
// p == 4 -- numbers[p] == 10

回転させる範囲を指定することもできる。

var numbers = [10, 20, 30, 40, 50, 60]
numbers.rotate(subrange: 0..<3, toStartAt: 1)
// numbers = [20, 30, 10, 40, 50, 60]
numbers.rotate(subrange: 3..<6, toStartAt: 4)
// numbers = [20, 30, 10, 50, 60, 40]

コメント

タイトルとURLをコピーしました