2016-07-28 6 views
0

大文字と小文字の配列があります。私は新しい配列の大文字と次の小文字を連結しようとしています。例えば、私は次の配列配列内の項目をマージするRuby

first_array = ["A","b","C","d","e"] 

を持っていると私は、このようなコードの最初の配列を反復処理しようとしています次の配列

["Ab","Cde"] #new array 

を取得したい:

new_array = [] 
first_array.each_with_index do |a,index| 
    if (a!~/^[a-z].*$/) 
    new_array = new_array.push "#{a}" 
    else 
    new_array[-1] = first_array[index-1] + "#{a}" #the idea is to concatenate the small letter with the previous capital letter and replace the last item in the new array 
    end 

しかし、動作しません。私はこの問題に効率的に取り組んでいるとは確信していません。それが解決できないのです。誰かがいくつかのオプションを提案できますか?

+0

「動作しません」と定義してください。 –

+0

@Sergio - 正しい結果が得られません。上のコードで私は["Ab"、 "de"]を得ます – Bastien

+0

質問にその情報を入れてください。 –

答えて

0

したがって、次のcharが大文字のときに元の配列を分割し、それらの部分配列の文字列を作成しますか?ここであなたを助けることができるa method in standard libあります:

def append_if_present(lowercase, letters) 
    lowercase << letters.join if letters.size > 0 
end 

first_array = ["A","b","C","d","e"] 

capitals = [] 
lowercase = [] 
letters = [] 

first_array.each_with_index do |l, i| 
    if l =~ /[A-Z]/ 
    capitals << l 
    append_if_present(lowercase, letters) 
    letters = [] 
    else 
    letters << l 
    end 
end 

append_if_present(lowercase, letters) 

p capitals.zip(lowercase).map(&:join) 
+0

感謝セルジオ。これは私が探しているものから最も近いですが、私は "結果"を配列ではなく文字列にしたいと思います。 – Bastien

+0

@Bastien:どうですか?あなたは質問の結果として文字列の配列を持っています。これが「結果」です。 –

0

は、ここでそれをしようとしたときに、私は醸造何すべての一致を得る:

first_array.join.scan(/[A-Z][a-z]*/) 
=> ["Ab", "Cde"] 
3

をあなたは、その後にスキャンすることができ、文字列として参加する場合:私はセルジオの答えたくさん好き

first_array = ["A","b","C","d","e"] 
result = first_array.slice_when do |a, b| 
    a_lower = a.downcase == a 
    b_upper = b.upcase == b 
    a_lower && b_upper 
end.map(&:join) 

result # => ["Ab", "Cde"] 
+0

あなたのregexソリューションと 'slice_when'ソリューションの間に、より最適化されたものがありますか? – Caillou

+1

@Caillou、違いがあると私は驚くだろうが、私の目ではこれはかなり良くなっている。希望の結果が与えられれば、最初のステップとしての「結合」は当然のようです。 –

0

はここEnumerable#slice_whenを用いる方法です:

first_array.slice_when{ |a, b| b.upcase == b && a.downcase == a }.map(&:join) 
+0

私は人々が「ここには1つのライナーがある」と言う理由を理解したことがなく、その後に1行のコードが続きます。 :-) '.to_a'は必要ありません。 –

+0

あなたは 'to_a'に感謝します。ありがとうございます。 「ここには1つのライナーがあります」の代わりに何を読みたいのですか? – Caillou

+0

"これは、[Enumerable#slice_when](http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-slice_when)を使用する方法です。 –

1

私は@ Paulの答えを好むが、あなたは以下を行うことができる。

first_array.slice_before { |s| s.upcase == s }.map(&:join) 
    #=> ["Ab", "Cde"] 
関連する問題