- 更新日: 2015年8月12日
- Swift & iOS
Swiftで配列(Array)をソート(sort, sorted)
Swift で配列(Array)をソートする方法を調べました。名前(String 型)のデータの配列を、大文字・小文字を無視してソートしたかった。例としては、[ “Mike”, “dave”, “sara”, “David”, “margaret” ] のような配列を [“dave”, “David”, “margaret”, “Mike”, “sara”] と、大文字・小文字を無視してソートしたかったのが調べたきっかけです。
— 環境 —
Xcode 6.3.2
Swift 1.2
sort で破壊的ソート、sorted で非破壊ソート
配列をソートするには Array#sort と Array#sorted というメソッドがあって、sort は元の配列自身を破壊的に変更してソートを行います。sorted のほうは非破壊的なソートを行い、元の配列自身を変更せずにソート済みの配列を返す。
以降、Xcode の Playground での動作確認です。
まずは sorted を使った非破壊的なソート。クロージャにソートの比較条件を書きます。{ $0 < $1 } と、要素が昇順になるような条件を渡している。
1 2 3 4 5 6 |
var names: [String] = ["Mike", "dave", "sara", "David", "margaret"] var sortedNames: [String] = names.sorted { $0 < $1 } sortedNames // => ["David", "Mike", "dave", "margaret", "sara"] names // => ["Mike", "dave", "sara", "David", "margaret"] |
sorted を使うと、元の配列自身は変更されず元のままであることが分かります。 次に破壊的なソートとなる sort を使った例。
1 2 3 |
names.sort { $0 < $1 } names // => ["David", "Mike", "dave", "margaret", "sara"] |
元の配列自身(names)が、破壊的に変更されてソートされました。
大文字・小文字を無視してソート、逆順にしたりなど
大文字・小文字を無視してソートしたい場合… つまり [“dave”, “David”, “margaret”, “Mike”, “sara”] という風に、dave, margaret が David, Mike より前に来るようにソートしたい場合は、クロージャに書くソート条件を一旦全て小文字にしてから比較するようにする。
1 2 3 |
names.sort { $0.lowercaseString < $1.lowercaseString } names // => ["dave", "David", "margaret", "Mike", "sara"] |
逆順にするには、Array#reverse() を使う。
1 2 3 4 |
names.reverse() // => ["sara", "Mike", "margaret", "David", "dave"] names // => ["dave", "David", "margaret", "Mike", "sara"] |
names は元のままなので、reverse() は非破壊なメソッドのようです。
Ruby の Array#sort メソッドに似た感じで、Swift の Array#sort もクロージャに比較条件を渡してソートするので、個人的には分かりやすいです。以上簡単ではありますけど、Swift で配列のソートを行うサンプルでした。
- – 参考リンク –
- [iOS8] Swiftで配列をソート(昇順・降順・逆さま)する方法 – Qiita
- モバイル開発系(K)-iOS Objective-C, Swift Tips 配列をソートする(Swift) [Array, sort, sorted]
- Swiftで複数の条件で配列をソートする – Qiita
- SwiftでNSMutableArrayに追加したObjectをNSSortDescriptor使ってソートする – Qiita
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!