🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

2回答

1313閲覧

これを短く書ける方!やり方があるなら教えて下さい

KTH

総合スコア86

Swift

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

1グッド

0クリップ

投稿2019/10/04 16:48

文字列を切り分けてほしい形の配列に変換するコードを書いたのですが長く感じています

短く書けるやり方があるで!という方よろしければやり方を教えて下さい

swift

1var strr = """ 2New 52-Week Highs: 57 3HIGH PRICE CHG CHG % VOLUME 4Alleghany Corp. 808.50 797.38 -0.38 -0.05 58.5K 5Ametek Inc. 92.86 88.80 -3.02 -3.29 2.2M 6Aramark 43.75 42.68 -0.90 -2.07 2.2M 7Asbury Automotive Group Inc. 104.55 99.14 -3.19 -3.12 216.4K 8Aspen Insurance Holdings Ltd. 5.95% Fixed-to-Floating Rate Perp. Pfd. 28.63 28.39 0.14 0.50 16.1K 9Bank of America Corp. 7.25% Non-Cum. Perp. Conv. Pfd. Series L 1501.80 1495.97 -3.24 -0.22 12.1K 10BB&T Corp. 53.90 52.34 -1.03 -1.93 8.0M 11Beazer Homes USA Inc. 15.04 14.66 -0.24 -1.61 438.1K 12Brookfield Renewable Partners L.P. 41.01 40.87 0.25 0.62 304.1K 13Cedar Fair L.P. Dep. Rec. 59.27 58.20 -0.16 -0.27 242.1K 14Citizens Financial Group Inc. Dep. Pfd. (Rep. 1/40th Perp. Pfd. Series D) 28.32 28.16 0.01 0.05 14.9K 15CoreSite Realty Corp. 122.45 119.26 -2.59 -2.13 288.1K 16Cypress Energy Partners L.P. 9.49 9.49 0.49 5.44 53.4K 17DHT Holdings Inc. 6.53 6.20 0.05 0.81 2.9M 18Dick's Sporting Goods Inc. 41.53 40.47 -0.34 -0.83 1.3M 19"""

こういうのを

swift

1["Alleghany Corp.", "Alleghany Corp.", "Ametek Inc.", "Aramark", "Asbury Automotive Group Inc.", "BB&T Corp.", "Beazer Homes USA Inc.", "Brookfield Renewable Partners L.P.", "Cedar Fair L.P. Dep. Rec.", "CoreSite Realty Corp.", "Cypress Energy Partners L.P.", "DHT Holdings Inc.", "Dick\'s Sporting Goods Inc."]

に変えるというものなのですが
私は以下のように書いたのですが
まだ短く書けるやり方があるなら教えて下さい

swift

1var dd:[String] = strr.components(separatedBy: "\n") 2 3var fg:[String] = [] 4 5 6 7dd.remove(at: 0) 8dd.remove(at: 0) 9 10for b in dd { 11 if b.contains("Fund"){ 12 var _ = b 13 } else if b.contains("Series"){ 14 var _ = b 15 } else if b.contains("%"){ 16 var _ = b 17 } else { 18 fg.append(b) 19 } 20 21} 22var gb = fg.count 23 24var ee4 = "(fg[0])" + " " 25var ttt = 0 26 27var a = 0 28while a < gb { 29 ee4 = ee4 + "(fg[a])" + " " 30 a = a + 1 31} 32var jj:[String] = ee4.components(separatedBy: " ") 33var pp:[String] = [] 34 35 36for d in jj { 37 if d.contains("0"){ 38 var _ = d 39 } else if d.contains("1"){ 40 var _ = d 41 } else if d.contains("2"){ 42 var _ = d 43 } else if d.contains("3"){ 44 var _ = d 45 } else if d.contains("4"){ 46 var _ = d 47 } else if d.contains("5"){ 48 var _ = d 49 } else if d.contains("6"){ 50 var _ = d 51 } else if d.contains("7"){ 52 var _ = d 53 } else if d.contains("8"){ 54 var _ = d 55 } else if d.contains("9"){ 56 var _ = d 57 } else { 58 pp.append(d) 59 } 60 61} 62print(pp) 63
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じになるかと思います。
具体的なコードは~~~調べながらやると良いかと思います。~~~ 下の方に追記した。

■ やりたいこと

  • 文字列から1列目を取得した配列をつくる

■ いまのコード

  1. 行単位で split して配列にする
  2. 最初の2行を捨てる
  3. 特定の文字列が入っている行を捨てる ( 2. と同じなのでたぶん要らない )
  4. 何をしているのか分からない部分
  5. 全部の行をタブ区切りで 1 つの文字列としてつなげる ( せっかく分けたのにもったいない )
  6. タブ区切りで split しなおして
  7. 数値の入った項目は捨てる ( 1列目に数字が入ってないのはたまたまだと思うけど )
  8. 残りを結果の配列に append する

# スペースが複数入っているところは タブ文字だと仮定した

■ もう少し普通に書くと

  1. 行単位で split して配列にする
  2. 最初の2行を捨てる
  3. 上の配列を for で回して、ループ内で 4, 5 の操作をする
  4. 各行の1列目だけとって(タブ区切りでsplitして0番目を取得 or タブ以降を削除)
  5. 結果の配列に append する

■ さらに短く書くと

  1. arr = str.split('\n')[2..].map(v => v.split('\t')[0]) みたいな感じで1行




せっかくなので、それぞれ書いてみた。 区切り文字はタブではないのですね・・。

swift

1var lines = str.components(separatedBy: "\n") 2 3lines.remove(at: 0) 4lines.remove(at: 0) 5 6var names: [String] = [] 7for line in lines { 8 let name = line.replacingOccurrences(of: " +[0-9(].*$", with: "", options: .regularExpression, range: line.range(of: line)) 9 names.append(name) 10} 11 12// print(names)

swift

1let names = str.components(separatedBy: "\n").dropFirst(2).map({ $0.replacingOccurrences(of: " +[0-9(].*$", with: "", options: .regularExpression, range: $0.range(of: $0)) }) 2 3// print(names)

投稿2019/10/05 18:07

編集2019/10/06 01:56
tanishi_a

総合スコア484

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

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

0

正規表現を使って文字列を抽出すれば良いんでは。

投稿2019/10/04 23:51

gentaro

総合スコア8947

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問