私は何かが不足しているかもしれませんが、最近いくつかの条件に従って最後のシンボルを取得するタスクに出くわしました。たとえば、私は文字列:"this_is_separated_values_5"
を持っています。今私は5
をInt
として抽出したいと思います。スカラーのtakeRightWhile()メソッド
注:_
で区切られた部分の数は定義されていません。
文字列にtakeRightWhile(f: Char => Boolean)
メソッドがある場合、それは簡単です:takeRightWhile(ch => ch != '_')
。さらに、効率的である。直接的な実装では、実際には_
という最後のインデックスを見つけて、このメソッドを使用すると部分的な文字列を取りますが、最初のステップが節約され、平均時間の複雑さが改善されます。
UPDATE:みんなあなたが実際に追加O(n)
スペースを使用して、str.reverse.takeWhile(_!='_').reverse
のすべてのバリエーションは非常に非効率的です。メソッドtakeRightWhile
を効率的に実装したい場合は、右から順番に繰り返し、結果を文字列ビルダーに累積して結果を返すことができます。私は、この種の方法について質問しています。すでに実装されている実装ではなく、質問自体で拒否されています。
質問:この種のメソッドはスカラー標準ライブラリに存在しますか?いいえの場合は、最小限の行数で同じようにするために、標準ライブラリからのメソッドの組み合わせはありますか?
ありがとうございます。あなたはfoldRightを使用して、以下の式で右から左に行くことができ
str.reverse.takeWhile(_!='_').reverse
更新
:
お返事ありがとうございます。質問の更新をご覧ください。 – tkachuko
私の更新を参照してください。これがあなたにいくつかのアイデアを与えることを願っています – Nyavro
ありがとうございました。少なくとも新しい文字列を作成しないので、以前のソリューションよりも効率的です。テール再帰とStringBuilderを簡素化して時間の複雑さを改善することができます(つまりfoldRightを終了させる)? – tkachuko