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

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

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

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

Q&A

解決済

1回答

674閲覧

文字列から多(2)次元配列を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2023/04/20 09:36

編集2023/04/20 15:36

前提

名前だけの文字列があります。
それを一次元配列に変更しています。

実現したいこと

20個ままでは一次元配列のままで良いのですが 20個以上 の場合は多次元配列にしたいです。

20個以下の場合
[name01, name02,...name20]

20個以上の場合
[
[name01, name02, ...name20],
[name21, name22, ...name40]
]

20個単位ごとに2次元配列に追加していきたいです。

条件

ユーザー名は100個までしかは入りません

発生している問題・エラーメッセージ

二次元配列化できない

該当のソースコード

Swift

1【現状】 2// 初期化 3var name: String = "" 4// 20個以下の配列 5var array: [String] = [] 6// 20個以上の配列 7var twoDimensionalArray: [[String]] = [[]] 8 9// 20個以下 10if name.count <= 20 { 11for i in 0..< self.name.count { 12self.array.append(name) 13print("----------------------------") 14print("arrayは") 15print(self.array) 16print("----------------------------") 17} 18 19// 20個以上 20} else { 21// ここで20個ずつの2次元配列にしたい 22for i in 0..< self.name.count { 23self.array.append(name) 24} 25 26// 回数 27if( (self.array.count % 20) == 0 ){ 28// 何もしない 29let count: Int = (self.array.count%20) 30} else { 31// +1する 32let count: Int = (self.array.count%20)+1 33} 34 35// 21個以上40未満までのケース 36if count == 2 { 37let array01 = array[0..<20] 38let array02 = array[21..<40] 39twoDimensionalArray[0].append(array01) 40twoDimensionalArray[1].append(array02) 41 42// 41個以上60未満までのケース 43} else if count == 3 { 44let array01 = array[0..<20] 45let array02 = array[21..<40] 46let array03 = array[41..<60] 47self.twoDimensionalArray[0].append(array01) 48self.twoDimensionalArray[1].append(array02) 49self.twoDimensionalArray[2].append(array03) 50 51// 61個以上80未満までのケース 52} else if count == 4 { 53let array01 = array[0..<20] 54let array02 = array[21..<40] 55let array03 = array[41..<60] 56let array04 = array[61..<80] 57self.twoDimensionalArray[0].append(array01) 58self.twoDimensionalArray[1].append(array02) 59self.twoDimensionalArray[2].append(array03) 60self.twoDimensionalArray[3].append(array04) 61} 62 63// 81個以上100未満までのケース 64else if count == 5 { 65let array01 = array[0..<20] 66let array02 = array[21..<40] 67let array03 = array[41..<60] 68let array04 = array[61..<80] 69let array05 = array[81..<100] 70self.twoDimensionalArray[0].append(array01) 71self.twoDimensionalArray[1].append(array02) 72self.twoDimensionalArray[2].append(array03) 73self.twoDimensionalArray[3].append(array04) 74self.twoDimensionalArray[4].append(array05) 75} 76 77print("----------------------------------") 78print("twoDimensionalArrayは") 79print(twoDimensionalArray) 80print("----------------------------------") 81} 82

試したこと

・reduce
・append[添字]

配列から二次元配列へ20個ごとに区切って追加する方法が知りたいです。
初心者なのでお手柔らかにお願いいたします。

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

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

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

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

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

hoshi-takanori

2023/04/20 11:41

Swift では、array という同じ変数を、ある時は1次元、またある時は2次元の配列として扱うことはできません。
退会済みユーザー

退会済みユーザー

2023/04/21 05:05

追記しました。 ご確認のほどよろしくお願いします。
MasakiHori

2023/04/24 09:05

普通は20個以下でも2次元配列で扱う設計にしますね([[name01,name02]]とかね) なぜ20以下とそれを超える場合で分ける必要があるのかもう一度考えてみた方がいいです それともそういう課題ですか?
退会済みユーザー

退会済みユーザー

2023/04/24 09:21

課題ではないです。
退会済みユーザー

退会済みユーザー

2023/04/24 09:30 編集

20個以下でも以上でも二次元配列で扱う方向にしてみます。
guest

回答1

0

ベストアンサー

こういう感じ

swift

1func f(_ array: [String], num: Int = 20) -> [[String]] { 2 var copy = array[...] 3 var result: [[String]] = [] 4 while copy.count > 0 { 5 result.append(Array(copy.prefix(num))) 6 copy = copy.dropFirst(num) 7 } 8 return result 9} 10

swift

1let r = f(array) 2 3if r.count < 2 { 4 let ppp = r.flatMap { $0 } 5 print(ppp) 6} else { 7 print(r) 8} 9

こういうすると20以下の時は特別扱い。

投稿2023/04/24 09:36

MasakiHori

総合スコア3384

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

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

退会済みユーザー

退会済みユーザー

2023/04/30 07:01

回答ありがとうございます。 No 'dropFirst' candidates produce the expected contextual result type '[String]' のエラーが出てしまいます。 ``` private func f(_ array: [String], num: Int = 20) -> [[String]] { var copy = self.array var result: [[String]] = [] while copy.count > 0 { result.append(Array(copy.prefix(num))) copy = copy.dropFirst(num) } return result } ```
MasakiHori

2023/05/01 03:24

提示されたコード断片からは状況がわからなかったためメソッドではなく関数で書いています。 メソッドとして実装し self.array を利用するのであれば第一引数は不要です。 エラーに関してですが、私が書いた var copy = array[...] の [...] は飾りでも落書きでもありません。必要なものです。 [...] はArrayからそのすべての要素を持ったArraySliceを生成するものです。 dropFirst() はArrayではなくArraySliceを返すためあらかじめ変数copyの型をArraySliceにしています。 なお変数名や関数名は私が動作確認のために適当に付けたものなので付けなおすことをお勧めします。
退会済みユーザー

退会済みユーザー

2023/05/30 10:37

ありがとうございます。 無事解決しました。 こちらがちゃんとコード読まずに返信してご迷惑をお掛けしました。 教えていただいたコードでちゃんと解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問