如何计算数组中字符串的平均长度?
How do I calculate the average length of a string in an array?
如何计算数组中字符串的平均长度?我以为我可以做到
2.4.0 :004 > arr = ["a", "ab", "abc"]
=> ["a", "ab", "abc"]
...
2.4.0 :006 > arr.inject{ |sum, el| sum + el.length }.to_f / arr.size
TypeError: no implicit conversion of Integer into String
from (irb):6:in `+'
from (irb):6:in `block in irb_binding'
from (irb):6:in `each'
from (irb):6:in `inject'
from (irb):6
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console.rb:65:in `start'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console_helper.rb:9:in `start'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:78:in `console'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:49:in `my_command!'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands.rb:18:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
但显然不是。
我会这样写:
arr.join.size / arr.size.to_f
此外,您可以使用 sum
,因为 Ruby 2.4:
arr.sum(&:size) / arr.size.to_f
#=> 2.0
inject
取 sum
的起始值。它默认为 String
。这有效:
arr.inject(0) { |sum, el| sum + el.length }.to_f / arr.size
之前 Ruby 2.4.0
arr.inject(0) { |acc, s| acc + s.length } / arr.size.to_f
Ruby2.4.0
之后
arr.sum(&:length) / arr.size.to_f
这里有一些基准:
require 'fruity'
arr = ["a", "ab", "abc"]
puts "Ruby #{RUBY_VERSION}"
compare do
ilya1 { arr.join.size / arr.size.to_f }
ilya2 { arr.sum(&:size) / arr.size.to_f }
derrell_durrett { arr.inject(0) { |sum, el| sum + el.length }.to_f / arr.size }
ursus1 { arr.inject(0) { |acc, s| acc + s.length } / arr.size.to_f }
ursus2 { arr.sum(&:length) / arr.size.to_f }
end
# >> Ruby 2.4.1
# >> Running each test 8192 times. Test will take about 1 second.
# >> ursus2 is similar to ilya2
# >> ilya2 is faster than ilya1 by 2x ± 0.1
# >> ilya1 is similar to ursus1
# >> ursus1 is similar to derrell_durrett
基本上 ursus2
和 ilya2
是相同的,因为 size
is an alias of length
.
如何计算数组中字符串的平均长度?我以为我可以做到
2.4.0 :004 > arr = ["a", "ab", "abc"]
=> ["a", "ab", "abc"]
...
2.4.0 :006 > arr.inject{ |sum, el| sum + el.length }.to_f / arr.size
TypeError: no implicit conversion of Integer into String
from (irb):6:in `+'
from (irb):6:in `block in irb_binding'
from (irb):6:in `each'
from (irb):6:in `inject'
from (irb):6
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console.rb:65:in `start'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console_helper.rb:9:in `start'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:78:in `console'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:49:in `my_command!'
from /Users/nataliab/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands.rb:18:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
但显然不是。
我会这样写:
arr.join.size / arr.size.to_f
此外,您可以使用 sum
,因为 Ruby 2.4:
arr.sum(&:size) / arr.size.to_f
#=> 2.0
inject
取 sum
的起始值。它默认为 String
。这有效:
arr.inject(0) { |sum, el| sum + el.length }.to_f / arr.size
之前 Ruby 2.4.0
arr.inject(0) { |acc, s| acc + s.length } / arr.size.to_f
Ruby2.4.0
之后arr.sum(&:length) / arr.size.to_f
这里有一些基准:
require 'fruity'
arr = ["a", "ab", "abc"]
puts "Ruby #{RUBY_VERSION}"
compare do
ilya1 { arr.join.size / arr.size.to_f }
ilya2 { arr.sum(&:size) / arr.size.to_f }
derrell_durrett { arr.inject(0) { |sum, el| sum + el.length }.to_f / arr.size }
ursus1 { arr.inject(0) { |acc, s| acc + s.length } / arr.size.to_f }
ursus2 { arr.sum(&:length) / arr.size.to_f }
end
# >> Ruby 2.4.1
# >> Running each test 8192 times. Test will take about 1 second.
# >> ursus2 is similar to ilya2
# >> ilya2 is faster than ilya1 by 2x ± 0.1
# >> ilya1 is similar to ursus1
# >> ursus1 is similar to derrell_durrett
基本上 ursus2
和 ilya2
是相同的,因为 size
is an alias of length
.