11

私はオンライン レッスンを受けていますが、通常は非常にシンプルな 1 行のソリューションです。次の配列を考えると、問題は次のように述べています。

["emperor", "joshua", "abraham", "norton"]

#inject次のように、文字列で結合されたすべての名前の単一の文字列を取得するために使用する必要があります。

"Emperor Joshua Abraham Norton"

#mapこれはとで簡単に実行できますが#join、この特定の演習では #inject のみを使用する必要があります。私はこのようなものを思いついた:

["emperor", "joshua", "abraham", "norton"].inject("") do |memo, word|
   memo << word.capitalize << " "
end

それは私に与えるでしょう:

"Emperor Joshua Abraham Norton "

文字列の末尾にある空白は、正しい解決策として渡されません。

  • 最後に空白なしでこれを達成するにはどうすればよいですか?
  • #injectこれは、空の文字列を渡す正しい使用方法ですか?
  • <<文字列を結合するために を正しく使用していますか?
4

6 に答える 6

10

これを試して:

a.map{|t| t.capitalize}.join(" ")

インジェクトで余分なスペースから逃れることはできないと思います。また、あなたがする必要があります

memo = memo + word.capitalize + " " 

編集: join と map を使用しないようにステートメントが変更されたため、inject を使用した少し醜いソリューションを次に示します。

a.inject("") do |memo, world|
  memo << " " unless memo.empty?
  memo << word.capitalize
end
于 2012-03-14T13:32:50.593 に答える
2
a = ["emperor", "joshua", "abraham", "norton"]
a.drop(1).inject(a.first.capitalize){|res,m| res << ' '+m.capitalize }
于 2012-03-14T13:26:14.343 に答える
1

" "すべてのターン を追加するためのチェックは、chop!最後に出力するよりもコストがかかります。あなたの選択は本当です。文字列連結<<を見ることができます。

%w(emperor joshua abraham norton).inject("") do |m,w|
  m << w.capitalize << " "
end.chop!
"Emperor Joshua Abraham Norton"
于 2012-03-14T14:22:48.093 に答える
1

より良い方法があり#injectます。他の回答を参照してください。しかし、あなたが主張するならString#rstrip、末尾のスペース文字だけでもかまいません.

または、文字を追加する前に、ブロックを裏返してメモが空かどうかを確認します。

memo << " " unless memo.empty?
memo << name.capitalize

<<オペレーターについてはわかりません。を使用します+が、それはおそらく個人的な好みです。

于 2012-03-14T13:35:18.050 に答える
0

を使用しないでください。それ#injectを解決するためのより良い方法があります。

["emperor", "joshua", "abraham", "norton"].map(&:capitalize).join(' ')

あなたの最初の目的は、常に目前の問題を解決することです。を使用することもできます#injectが、ここでは理想的な、または明確なソリューションではありません。#injectだまして正しい結果を得る方法を見つけようとするよりも、時間を有効に使う方がよいでしょう。

于 2012-03-14T13:25:37.387 に答える