Swift Algorithmsとは 2020年にAppleが公開したオープンソースパッケージで、順序とコレクションに関する便利なアルゴリズムを提供してくれます。
GitHub - apple/swift-algorithms: Commonly used sequence and collection algorithms for Swift
Commonly used sequence and collection algorithms for Swift - apple/swift-algorithms
利用するには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]
コメント