質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

109閲覧

swift での配列の変換について教えてください

sgt.kowalski

総合スコア34

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/08/16 15:29

例えば 1からnまでの整数がランダムに並んでいる一次配列があったとして、
これを10単位でくくった二次配列に変換したいのですが、なにか上手い方法はありますでしょうか?

例えば以下のような感じです。

一次配列
[12,18,24,36,75,98,101,104,119,120]

二次配列
[]
[12,18]
[24]
[36]
[]
[]
[]
[75]
[]
[98]
[101,104]
[119]
[120]

値がないところ(上記の二次配列の[]になっているところ)も含めた二次配列というのは作れるものなのでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

もっと綺麗に書けるかもしれないけど力技
10で割った商(整数)が同じものをグループにしている。
商をkeyとした連想配列を作成。keyは0〜商の最大値でシーケンスに生成
連想配列をkeyでソートして値を取り出す

swift

1let values = [12,18,24,36,75,98,101,104,119,120] 2 let groups = values.map { (group : $0 / 10, origin: $0) } 3 var dict :[Int: [Int]] = [:] 4 for i in (0...groups.map{$0.group}.max()!) { 5 dict[i] = [] 6 } 7 for value in groups { 8 dict[value.group] = dict[value.group]! + [value.origin] 9 } 10 let result = dict.sorted{ $0.0.key < $0.1.key }.map { $0.value } 11 print(result)

結果
[[], [12, 18], [24], [36], [], [], [], [75], [], [98], [101, 104], [119], [120]]

投稿2017/08/16 17:55

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sgt.kowalski

2017/08/17 04:08

ありがとうございます! mapって初めて見ましたが、これ便利そうです! 色々試してみます! 2行目の「group:」と書くことで、「:以下の条件(今回だと10で割った商)ごとに、origin:以下(今回だと全部の要素)を仕分けしろ」という意味になる、という理解で合ってますでしょうか? そして、甘えついでで恐縮なのですが、これに関連して、もう一つ質問させて頂いてもいいでしょうか?
guest

0

方法は色々あると思うと思うので、私のはほんの参考程度のつもりで書いてます。
きっともっといい方法とかもあると思うのですが、とりあえずなんでもいいのならこんな感じもありかなと思いました(/ω\)

var ArrGloup:Array<Any> = [] let numArray = [12,18,24,36,75,98,101,104,119,120,0] for _ in 1...10{ let n:Int = Int(arc4random()) % 9 let w:Int = Int(arc4random()) % 9 var Arry = [numArray[n], numArray[w]] if(n == w){ Arry = [] }else if(n > w){ Arry = [n] } ArrGloup.append(Arry) } print("????\(ArrGloup)")

得る結果例
????[[98, 101], [24, 36], [18, 75], [], [24, 104], [75, 104], [8], [6], [7], [8]]

投稿2017/08/16 16:19

sachiko-kame

総合スコア334

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sgt.kowalski

2017/08/17 04:02

ご回答ありがとうございます! arc4random()を使った並べ替えって、全く思いつきませんでした。 なんか斬新でカッコいいです! 今回のやりたいこととは合わないのですが、配列をランダムに並べ替えてアウトプットすることが必要な、アバンギャルドなアプリも作ってみたくなりました! 笑
sachiko-kame

2017/08/17 10:06

優しいお言葉ありがとうございますo(▽`)o⭐️いい方法見つかってよかったです。色々なアプリ沢山作ってくれるの期待します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問