programing

루비에서 숫자 배열을 합치는 방법은 무엇입니까?

stoneblock 2023. 5. 24. 21:38

루비에서 숫자 배열을 합치는 방법은 무엇입니까?

저는 정수 배열을 가지고 있습니다.

예:

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 }

Ruby의 열거형 설명서 참조

(참고: 더0베이스 케이스가 필요합니다.0다음 대신 빈 배열로 반환됩니다.nil)

array.reduce(0, :+)

와 동등한 반면에array.inject(0, :+)축소라는 용어MapReduce 프로그래밍 모델의 등장과 함께 더 일반적인 언어로 진입하고 있습니다.

주입, 축소, 접기, 누적 압축은 모두 접기 함수의 클래스와 동의어입니다.코드 기반 전체의 일관성이 가장 중요하지만, 다양한 커뮤니티가 다른 단어보다 한 단어를 선호하는 경향이 있기 때문에 그럼에도 불구하고 대안을 아는 것이 유용합니다.

지도를 축소하는 용어를 강조하기 위해, 여기 그 배열에 있는 것에 대해 조금 더 관대한 버전은 다음과 같습니다.

array.map(&:to_i).reduce(0, :+)

관련 추가 수치:

또는 레일이 설치되어 있는 경우(실제로는 액티브 지원만):

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