1

私のコードはここにあります

str = "Early in his first term in office, Obama signed into law economic stimulus legislation in response"
arr= str.split(" ")
set_element= arr.each_cons(2).to_a
sub_str = set_element.map {|i| i.join(' ')}

非常に大きな文字列のような大きな文字列がある場合、このタイプの結果が必要なため、このプロセスには 6.50 秒かかります

sub_str= ["Early in", "in his", "his first", "first term", "term in", "in office,", "office, Obama", "Obama signed", "signed into", "into law", "law economic", "economic stimulus", "stimulus legislation", "legislation in", "in response"]

効率的な方法で別の方法で可能ですか

4

3 に答える 3

7

分割の代わりにスキャンを使用すると、単語のペアを直接取得できます。

s.scan(/\S+(?:\s+\S+)?/)

編集:これが比較的効率的であることを確認するために、小さなマイクロベンチマークを作成しました。これまでに確認された回答の結果は次のとおりです。

ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-linux]
10 times on string of size 2284879
                 user     system      total        real
original     4.180000   0.070000   4.250000 (  4.272856)
sergio       2.090000   0.000000   2.090000 (  2.102469)
dbenhur      1.050000   0.000000   1.050000 (  1.042167)
于 2013-03-22T06:13:04.640 に答える
1
set_element = arr.each_cons(2).to_a

上記の行は、必要のない大量の一時オブジェクトを作成します。これを試してみてください。より速くなるはずです:

str = "Early in his first term in office, Obama signed into law economic stimulus legislation in response"
arr = str.split(" ")
sub_str = arr.each_with_object([]).with_index do |(el, memo), idx|
  if idx % 2 == 0
    memo << el
  else
    memo.last << ' ' << el
  end

end

sub_str # => ["Early in", "his first", "term in", "office, Obama", "signed into", "law economic", "stimulus legislation", "in response"]
于 2013-03-22T05:45:05.547 に答える
0

これを試すことができます。一歩少ない:)

arr= str.scan(/\S+/)
s = []
arr.each_with_index { |x, i| s << (x + " " + arr[i + 1]) if arr[i+1] }
于 2013-03-22T10:35:13.220 に答える