LoginSignup
9
1

More than 5 years have passed since last update.

配列を条件のもとに分割するうまい方法を考えたかった

Last updated at Posted at 2016-12-12

がっじゅぐいぎだがっだぁああああ

こんにちは 131e55 です❗
Swift愛好会 Advent Calendar 2016 13日目です❗

また、Swift その2 Advent Calendar 2016 13日目 - ポーカー作りで Swift 3 の空気を感じるも同日公開しているので覗いてみてください🐱(宣伝)

さて、Swift愛好会には多分過去2回お邪魔させていただきまして、いつも気軽にお話できる印象があり楽しい限りです。🍺のせいかもしれませんが(´•⌔•`)
今回は、Swift を書いているときに、配列を条件のもとに分割したくなったけどうまい方法がわからなく色々考えた。というお話をしたいと思います❗Swift愛好会の皆様からのアイデアを募集します❗(たすけて

メインテーマ「配列を条件のもとに分割したい」

例1. Int の配列を奇数と偶数の配列に分割したい

let numbers: [Int] = [1, 2, 3, 4, 5, 6]
// ↓
// [1, 3, 5]
// [2, 4, 6]

例2. UIColor の配列を有彩色と無彩色の配列に分割したい

let colors: [UIColor] = [.red, .green, .blue, white, .cyan, .magenta, .yellow, .black, .gray]
// ↓
// [.red, .green, .blue, .cyan, .magenta, .yellow]
// [.white, .black, .gray]

アプローチ1. filter 連打

スクリーンショット 2016-12-05 21.28.43.png

第一感は filter でした。filter を使えば条件に合うものを抽出できますが、元の配列は変更されないので奇数の抽出と偶数の抽出を2回やるという方法です。無難そうですが filter 一回につき全要素を洗ってしまうのは冗長な感じ。なんで6回じゃなく7回なのかはわかりませんが。

アプローチ2. filter + 差集合

スクリーンショット 2016-12-05 21.58.40.png

これは……読みづらすぎる感……。しかも一度集合にしてしまうので Hashable な配列である必要がありますし、配列の順番が保証されないので、ここから sort を走らせるならやっぱり filter 連打の方が良さそうです。

アプローチ3. reduce で頑張る

スクリーンショット 2016-12-05 22.42.01.png

filter 連打のループ数問題は解決されてますが、長いし何より読みづらい。これなら filter 連打で良いかな…。

アプローチ4. おとなしく for in

スクリーンショット 2016-12-05 22.04.22.png

なんか古臭い気もしますがありそうっちゃありそうです。ただ for で回すと reduce もそうですが回して何をしたいのかを解読しないといけません。何より oddNumbersevenNumbers を定数にしたいときどうしたらいいんでしょう。やっぱり filter 連打かな…❓

アプローチ5. 最終手段 Array 拡張

スクリーンショット 2016-12-05 22.51.11.png

条件を渡して条件に合うものと合わないものに2分する separatedArray に追加してみました。
なんで7回になるのかはやっぱりわかりませんがすごく良さそうです。filter 連打のループ数問題も解決されていますし読みやすさも悪くないかと。
しかし extension はオレオレになりがちなところが気になるので標準でで きるなら標準でしたほうが良い気も。個人的には変な改造せずに標準で使っていきたい派なのでやっぱり filter 連打を選択しそうかも…?

おしえてSwift愛好会のみんな❗

というわけでどうするのが良いと思いますか❓皆様のアイデア募集❗
「こんなことしなくても◯◯でええやん」的なのに期待してます(´•⌔•`)

9
1
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1