2016-08-03 15 views
-1

配列を配列の配列に分割したい。条件付きで配列を反復する

test_ary = %w(101 This is the first label 102 This is the second label 103 This is 
the third label 104 This is the fourth label) 

result = iterate_array(test_ary) 

予想される出力:私は簡単に、よりエレガントな方法がなければならないと思います

def iterate_array(ary) 
    temp_ary = [] 
    final_ary =[] 
    idx = 0 
    temp_ary.push ary[idx] 
    idx +=1 
    done = ary.length - 1 
    while idx <= done 
     if ary[idx] =~ /\d/ 
      final_ary.push temp_ary 
      temp_ary = [] 
      temp_ary.push ary[idx] 
     else 
      temp_ary.push ary[idx] 
     end 
     idx +=1 
    end 
    final_ary.push temp_ary 
    returned_ary=final_ary.map {|nested_ary| nested_ary.join(" ")} 
    returned_ary 
end 

#⇒ [ 
# "101 This is the first label", 
# "102 This is the second label", 
# "103 This is the third label", 
# "104 This is the fourth label" ] 

私は、次のような方法を書きました。何か案は?

+2

こんにちはM君ならば、それが役立つだろう期待される出力が含まれていると、フォーマットエラーの一部を解決するのに役立ちます。 – mwp

+0

申し訳ありません。私はちょうどフォーマットにキャッチしています。うまくいけば私はそれをきれいにした(Vladの助けを借りて) - M –

答えて

0

あなたの関数が私に与える出力に基づいて、%w(101 This is the first label 102 This is the second label 103 This is the third label 104 This is the fourth label).each { |x| puts x }またはmapを使用しても同じ結果が得られます。期待される成果を投稿することができれば助かります。

1

これは、一度に2つの要素を繰り返し処理し、右側が数値の場合は(ブレーク)(スライス)、右側の部分に数字がない場合は書き込まれます。桁数字)。お役に立てれば!

test_ary.slice_when { |_, r| r !~ /\D/ }.map { |w| w.join(' ') } 
+0

それは正規表現のかなり良い使用です。しかし、それは配列が常に数値のときに破棄されることを前提としています。それにもかかわらず、良い答え。 +1 – Vlad

+1

ありがとう@Vlad。それは入力に関するいくつかの強力な前提を作りますが、元の質問で利用可能な情報はすべて取り除くことができます! – mwp

+0

ありがとうmwp。私はruby-doc.orgの基本的なArrayクラスのドキュメントにあまりにも頼っていると思います。私はruby-lang.orgの#slice_whenと#slice_betweenに関する情報を見つけました。しかし、私は混乱しています:私はArray.methodsを入力すると、どの配列がEnumerableから継承する必要がありますか?それは... –

3

私はEnumerable#slice_beforeを使用します。

test_ary.slice_before { |w| w =~ /\d/ }.map { |ws| ws.join(" ") } 
# => ["101 This is the first label", "102 This is the second label", "103 This is the third label", "104 This is the fourth label"] 

編集:@mwpが言ったように、あなたはこれをさらに短くすることができます。

test_ary.slice_before(/\d/).map { |ws| ws.join(" ") } 
# => ["101 This is the first label", "102 This is the second label", "103 This is the third label", "104 This is the fourth label"] 
+2

かなりいいですね!私はslice_whenよりもこれが好きです。 slice_beforeはパターン引数を取ることができるので、 'words.slice_before(/ \ d /)'に単純化することができます。 – mwp

+0

@mwpありがとう!私はそれを知らなかった。 – Dogbert

2
▶ test_ary.join(' ').split(/ (?=\d)/) 
#⇒ [ 
# [0] "101 This is the first label", 
# [1] "102 This is the second label", 
# [2] "103 This is the third label", 
# [3] "104 This is the fourth label" 
# ] 
+0

Thx muda。正規表現を使用すると、長い道のりを行く –

+0

ようこそ、私はあなたが意味するものを理解することができません。 – mudasobwa

関連する問題