2016-11-03 8 views
0

私はこの問題に何度もぶつかってきました。私の基準は、私がより良い解決策を望むところまで上昇しました。私はES6を使ってデモンストレーションしますが、答えを同じ言語に限定する必要はありません。アイテム間のスペース

条件付きで印刷されますが、各単語の間にセパレータを印刷する必要があります(最初の単語を除くすべての単語の前)。

私は、多くの場合、それはそうのように解決しているif文の長い鎖でこの問題が発生します。

let something_printed = false; 
if (condition1) { 
    print(word1); // no space needed here 
    something_printed = true; 
} 
if (condition2) { 
    if (something_printed) 
     print(' '); // but now a space is necessary 
    print(word2); 
    something_printed = true; 
} 
if (condition3) { 
    if (something_printed) 
     print(' '); // here too 
    print(word3); 
    something_printed = true; 
} 

またはループ中:

let something_printed = false; 
for (let [word, condition] of word_conditions) { 
    if (condition) 
     if (something_printed) 
     print(' '); 
    print(word); 
    something_printed = true; 
} 

ちょうど区切りを印刷するには、余分な条件付きのこと、 、私にはバグがありません。だから私は、(上記の例のいずれかに適合させることができる)、以下を思い付いた:私が思い付くしている最も簡潔なソリューションです

let separator = ''; // separator is initially empty 
for (let [word, condition] of word_conditions) 
    if (condition) { 
     print(separator + word); 
     separator = ' '; // separator is a space here on out 
    } 

私がやっているものです...かなり長い間。

そこでここでは、2つのループを有する

は、最初のループは、最初の印刷された言葉をキャッチし、第二は、先行するすべての言葉ハンドル:余分なインデックスを無視

let words = word_conditions.keys(); 
let conditions = word_conditions.values(); 
let index; 
for (index = 0; index < words.length; index++) 
    if (conditions[index]) { 
     print(words[index]); 
     break; 
    } 
for (; index < words.length; index++) 
    if (conditions[index]) 
     print(' ' + words[index]); 

を、第二のループで無駄な努力はありません、これは素晴らしいですが、これはより冗長な解決策であり、余分なインデックス作成を無視するように努力しています。

2パスアプローチは、いくつかの希望を提供するかもしれないように見える、と十分にいいですが、最も簡潔ではなく、時間と印刷された単語の配列を構築するため、メモリに代金を支払う:

let unconditional_words = []; 
for (let [word, condition] of word_conditions) 
    if (condition) 
     unconditional_words.push(word); 
print(unconditional_words.pop()); 
for (let word of unconditional_words) 
    print(' ' + word); 

確かに、これはあいまいですが、私はいつもこれに就いています。そこには、簡潔で効率的な実装が必要です。私はより機能的なアプローチを模索していませんが、上に示したよりもいくつかの優れた解決策が含まれているように感じます。

エピローグ

私が考えていたプラットフォームは、実際に配列を作成し、参加を実行するためのスペースを持っていないように私はおそらく私の例については、Javascriptを使用しているべきではありません。 (古いマイクロコントローラを考えてみてください)しかし、私がやる作業の大部分はこのように限定されていません。私がこのスペースを惜しむことができないところでは、私は上記の3番目の実装に固執します。現代の技術では、join()は適用可能で、簡潔で効率的です。いつものように、他人の仕事を活用するのが最善の方法です。感謝の影。

let words = []; 
if (condition1) 
    words.push(word1); 
if (condition2) 
    words.push(word2); 
if (condition3) 
    words.push(word3); 
print(words.join(' ')); 

をループを備えた第二の例の場合:

let words = []; 
for (let [word, condition] of word_conditions) 
    if (condition) 
     words.push(word); 
print(words.join(' ')); 

私は、簡単にシンプル、かつ理解しやすい与え

だから、IFSと私の最初の例では、そうのような)(結合を使用することができますソリューション。ニース。

答えて

1

joinの機能を探しているような感じです。 ジャバスクリプト(およびES6)で

["First item", "Second item"].join(", "); 

はJavaScriptでこれを行う方法で構築された結合を使用して

"First item, Second item" 
+0

右。それはおそらく、問題に近づくための最良の方法です。誰かのカプセル化されたソリューションを使用してください。私はjoin()の実装をいくつか見てきました。彼らは簡潔ではありませんでしたが、私にエレガントなソリューションに関する啓示につながっていませんでしたが、確かに効率的でした。 – Mark

+0

組み込みの実装ではなく、組み込みの実装を見ていた理由は何ですか?問題を解決するのではなく、独自のバージョンを作成する方法を検討しようとしていますか? – Shadow

0

を返します。

var words = "Hello this is my sentence"; 
 
var comma = words.split(" ").join(", "); 
 
console.log(comma);

関連する問題