루비에서 숫자 배열을 합치는 방법은 무엇입니까?
저는 정수 배열을 가지고 있습니다.
예:
array = [123,321,12389]
그것들의 합계를 얻을 수 있는 좋은 방법이 있습니까?
나는 그것을 알고 있습니다.
sum = 0
array.each { |a| sum+=a }
효과가 있을 것입니다.
루비 >= 2.4의 경우 합계를 사용할 수 있습니다.
array.sum
Ruby < 2.4의 경우 주입을 사용할 수 있습니다.
array.inject(0, :+)
참고: 더0
그렇지 않으면 베이스 케이스가 필요합니다.nil
빈 배열에서 반환됩니다.
> [].inject(:+)
nil
> [].inject(0, :+)
0
사용해 보십시오.
array.inject(0){ |sum, x| sum + x }
(참고: 더0
베이스 케이스가 필요합니다.0
다음 대신 빈 배열로 반환됩니다.nil
)
array.reduce(0, :+)
와 동등한 반면에array.inject(0, :+)
축소라는 용어는 MapReduce 프로그래밍 모델의 등장과 함께 더 일반적인 언어로 진입하고 있습니다.
주입, 축소, 접기, 누적 및 압축은 모두 접기 함수의 클래스와 동의어입니다.코드 기반 전체의 일관성이 가장 중요하지만, 다양한 커뮤니티가 다른 단어보다 한 단어를 선호하는 경향이 있기 때문에 그럼에도 불구하고 대안을 아는 것이 유용합니다.
지도를 축소하는 용어를 강조하기 위해, 여기 그 배열에 있는 것에 대해 조금 더 관대한 버전은 다음과 같습니다.
array.map(&:to_i).reduce(0, :+)
관련 추가 수치:
- http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject
- http://en.wikipedia.org/wiki/MapReduce
- http://en.wikipedia.org/wiki/Fold_(higher-order_function)
또는 레일이 설치되어 있는 경우(실제로는 액티브 지원만):
require 'activesupport'
array.sum
Ruby >=2.4.0의 경우 사용할 수 있습니다.sum
열거 가능에서.
[1, 2, 3, 4].sum
패치 베이스 클래스를 흡연하는 것은 위험합니다.만약 당신이 위험을 좋아하고 이전 버전의 루비를 사용한다면, 당신은 추가할 수 있습니다.#sum
에게Array
클래스:
class Array
def sum
inject(0) { |sum, x| sum + x }
end
end
Ruby 2.4.0의 새로운 기능
적절한 명명된 방법을 사용할 수 있습니다.Enumerable#sum
그것은 보다 많은 이점을 가지고 있습니다.inject(:+)
하지만 마지막에 읽어야 할 중요한 메모들도 있습니다.
예
범위
(1..100).sum
#=> 5050
배열
[1, 2, 4, 9, 2, 3].sum
#=> 21
[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7
중요사항
이 방법은 다음과 같지 않습니다.#inject(:+)
.예를들면
%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer
또한.
(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)
이유에 대한 자세한 내용은 이 답변을 참조하십시오.sum
이런 거예요.
루비 2.4+ / 레일즈 -array.sum
예.[1, 2, 3].sum # => 6
루비 프리 2.4 -array.inject(:+)
또는array.reduce(:+)
*참고: The#sum
메소드는 2.4의 새로운 추가 기능입니다.enumerable
이제 사용할 수 있습니다.array.sum
레일즈뿐만 아니라 순수한 루비로.
다양성을 위해 배열이 숫자 배열이 아니라 숫자(예: 양)의 속성을 가진 개체 배열인 경우에도 이 작업을 수행할 수 있습니다.
array.inject(0){|sum,x| sum + x.amount}
루비 1.8.7 방법은 다음과 같습니다.
array.inject(0, &:+)
Ruby 2.4.0은 릴리즈되며 Enumerable#sum 메서드를 사용합니다.할 수 있습니다.
array.sum
문서의 예:
{ 1 => 10, 2 => 20 }.sum {|k, v| k * v } #=> 50
(1..10).sum #=> 55
(1..10).sum {|v| v * 2 } #=> 110
0 값을 가진 배열의 경우 압축을 수행한 다음 합계를 주입할 수 있습니다.
a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
또한 다음을 허용합니다.[1,2].sum{|x| x * 2 } == 6
:
# http://madeofcode.com/posts/74-ruby-core-extension-array-sum
class Array
def sum(method = nil, &block)
if block_given?
raise ArgumentError, "You cannot pass a block and a method!" if method
inject(0) { |sum, i| sum + yield(i) }
elsif method
inject(0) { |sum, i| sum + i.send(method) }
else
inject(0) { |sum, i| sum + i }
end
end
end
방법 1:
[1] pry(main)> [1,2,3,4].sum
=> 10
[2] pry(main)> [].sum
=> 0
[3] pry(main)> [1,2,3,5,nil].sum
TypeError: nil can't be coerced into Integer
방법 2:.
[24] pry(main)> [].inject(:+)
=> nil
[25] pry(main)> [].inject(0, :+)
=> 0
[4] pry(main)> [1,2,3,4,5].inject(0, :+)
=> 15
[5] pry(main)> [1,2,3,4,nil].inject(0, :+)
TypeError: nil can't be coerced into Integer
from (pry):5:in `+'
방법 3:
[6] pry(main)> [1,2,3].reduce(:+)
=> 6
[9] pry(main)> [].reduce(:+)
=> nil
[7] pry(main)> [1,2,nil].reduce(:+)
TypeError: nil can't be coerced into Integer
from (pry):7:in `+'
방법 4: 배열에 0과 빈 값이 포함되어 있는 경우 기본적으로 위의 함수를 사용할 경우 축소, 합계, 모든 것을 주입합니다.
유형 오류: 0은(는) 강제로 정수로 지정할 수 없습니다.
당신은 이것을 극복할 수 있습니다.
[16] pry(main)> sum = 0
=> 0
[17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
=> [1, 2, 3, 4, nil, ""]
[18] pry(main)> sum
=> 10
방법 6: 평가하다
문자열의 Ruby 식을 평가합니다.
[26] pry(main)> a = [1,3,4,5]
=> [1, 3, 4, 5]
[27] pry(main)> eval a.join '+'
=> 13
[30] pry(main)> a = [1,3,4,5, nil]
=> [1, 3, 4, 5, nil]
[31] pry(main)> eval a.join '+'
SyntaxError: (eval):1: syntax error, unexpected end-of-input
1+3+4+5+
만약 당신이 골프를 친다면, 당신은 할 수 있습니다.
eval [123,321,12389]*?+
이렇게 하면 "123+321+12389" 문자열이 생성된 다음 함수 eval을 사용하여 합계를 수행합니다.골프 전용이므로 올바른 코드로 사용해서는 안 됩니다.
또한 쉬운 방법으로 할 수 있습니다.
def sum(numbers)
return 0 if numbers.length < 1
result = 0
numbers.each { |num| result += num }
result
end
.map 및 .sum은 다음과 같이 사용할 수 있습니다.
array.map { |e| e }.sum
언급URL : https://stackoverflow.com/questions/1538789/how-to-sum-array-of-numbers-in-ruby
'programing' 카테고리의 다른 글
배열에서 하나의 요소를 값으로 삭제하는 방법 (0) | 2023.05.24 |
---|---|
새 파일이 없는 경우 파일에 쓰고 파일이 있는 경우 파일에 추가 (0) | 2023.05.24 |
기본 창 앞에 대화 상자를 표시하는 WPF (0) | 2023.05.24 |
VB.NET에서 문자열 배열 선언 및 초기화 (0) | 2023.05.19 |
항목() 대신 반복 항목()을 사용해야 하는 경우는 언제입니까? (0) | 2023.05.19 |