मेरे पास एक पूर्णांक है।
उदाहरण के लिए:
array = [123,321,12389]
क्या उनके योग का कोई अच्छा तरीका है?
मुझे पता है
sum = 0
array.each { |a| sum+=a }
काम करेगा।
मेरे पास एक पूर्णांक है।
उदाहरण के लिए:
array = [123,321,12389]
क्या उनके योग का कोई अच्छा तरीका है?
मुझे पता है
sum = 0
array.each { |a| sum+=a }
काम करेगा।
जवाबों:
इसे इस्तेमाल करे:
array.inject(0){|sum,x| sum + x }
देखिए रूबी का दमदार डॉक्यूमेंटेशन
(ध्यान दें: 0
आधार मामले की आवश्यकता है ताकि 0
एक खाली सरणी पर लौटा दिया जाए nil
)
array.inject(:+)
अधिक कुशल है।
array.inject(:+)
रूबी में परेशानी का कारण लगता है 1.8.6 अपवाद "LocalJumpError: कोई ब्लॉक नहीं दिया गया" पॉप अप हो सकता है।
array.sum
आप सरणी मूल्यों का योग दे सकते हैं।
reduce
, जो inject
(जैसा कि array.reduce( :+ )
) का एक उपनाम है ।
inject
बजाय उपयोग करने के लिए चेतावनी देगा reduce
।
या रूबी 1.9 तरीका आज़माएँ:
array.inject(0, :+)
नोट: 0
आधार मामले की जरूरत है अन्यथा nil
खाली सरणियों पर लौटा दिया जाएगा:
> [].inject(:+)
nil
> [].inject(0, :+)
0
array.map(&:price).inject(0, :+)
थोड़ा सुरक्षित है। यह सुनिश्चित करता है कि यदि आपके पास खाली सूची है तो आपको शून्य के बजाय 0 मिलता है ।
array.inject(0) { |sum, product| sum += product.price }
array.reduce(0, :+)
जबकि समतुल्य array.inject(0, :+)
, टर्म कम करना MapReduce प्रोग्रामिंग मॉडल के उदय के साथ एक अधिक सामान्य वर्नाक्यूलर में प्रवेश कर रहा है ।
सुई , को कम करने , गुना , संचित , और संपीड़ित सभी के एक वर्ग के रूप में पर्याय बन गया है कार्यों तह । मुझे आपके कोड आधार में निरंतरता सबसे महत्वपूर्ण लगती है, लेकिन चूंकि विभिन्न समुदाय एक शब्द को दूसरे पर पसंद करते हैं, इसलिए विकल्प जानना गैर-उपयोगी है।
मानचित्र-कम करने की क्रिया पर जोर देने के लिए, यहां एक संस्करण है जो उस सरणी में समाप्त होने पर थोड़ा अधिक क्षमा करने योग्य है।
array.map(&:to_i).reduce(0, :+)
कुछ अतिरिक्त प्रासंगिक पढ़ने:
reduce
मुझे बताता है कि फ़ंक्शन क्या करता है, लेकिन inject
बहुत कूलर ध्वनि करता है।
reduce
और map
उच्च-क्रम के कार्यों के रूप में MapReduce की भविष्यवाणी। प्रेरणा दूसरे तरीके से चलती है। और MapReduce के अर्थ में, यह एक साधारण कार्यात्मक कमी की तुलना में कुछ अलग ऑपरेशन है, विभिन्न मशीनों के संचार के लिए निहितार्थ हैं।
वैकल्पिक रूप से (केवल तुलना के लिए), यदि आपके पास रेल स्थापित है (वास्तव में सिर्फ ActiveSupport):
require 'activesupport'
array.sum
require 'active_support/core_ext/enumerable.rb'
या सभी सक्रिय समर्थन की आवश्यकता है require 'active_support/all'
:। इसके बारे में यहाँ और अधिक: एपीआई डॉक्स
activesupport
एक बड़े पैमाने पर निर्भरता array.inject(:+)
है array.sum
।
require 'active_support/core_ext/enumerable'
बिना होना चाहिए .rb
, क्योंकि इसमें निहित है।
रूबी> = 2.4.0 के लिए आप sum
Enumerables से उपयोग कर सकते हैं ।
[1, 2, 3, 4].sum
आधार क्लासेस को रोकना खतरनाक है। आप खतरे और रूबी के एक पुराने संस्करण का उपयोग कर चाहें, तो आप जोड़ सकते हैं #sum
करने के लिए Array
वर्ग:
class Array
def sum
inject(0) { |sum, x| sum + x }
end
end
आप उपयुक्त नाम पद्धति का उपयोग कर सकते हैं 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
है के बारे में अधिक जानकारी के लिए यह उत्तर देखें ।
विविधता के लिए, आप यह भी कर सकते हैं यदि आपकी सरणी संख्याओं की एक सरणी नहीं है, बल्कि उन वस्तुओं की एक सरणी है जिनमें गुण हैं जो संख्याएँ हैं (जैसे राशि):
array.inject(0){|sum,x| sum + x.amount}
array.map(&:amount).inject(0, :+)
:। अन्य उत्तर देखें।
map
तब inject
आपको दो बार सरणी के माध्यम से लूप की आवश्यकता होती है: एक बार एक नया सरणी बनाने के लिए, दूसरा सदस्यों को योग करने के लिए। यह विधि थोड़ी अधिक क्रियात्मक है, लेकिन अधिक कुशल भी है।
रूबी 2.4+ / रेल्स - array.sum
अर्थात[1, 2, 3].sum # => 6
रूबी पूर्व 2.4 - array.inject(:+)
याarray.reduce(:+)
* नोट: #sum
विधि 2.4 के लिए एक नया अतिरिक्त है, enumerable
इसलिए अब आप array.sum
केवल रेल में नहीं बल्कि शुद्ध रूबी में उपयोग कर पाएंगे ।
रूबी 1.8.7 तरीका निम्नलिखित है:
array.inject(0, &:+)
आप बस का उपयोग कर सकते हैं:
example = [1,2,3]
example.inject(:+)
inject(:+)
लेकिन यह नहीं है inject :+
?
रूबी 2.4.0 जारी किया गया है, और इसमें एक Enumerable # योग विधि है। तो आप कर सकते हैं
array.sum
डॉक्स से उदाहरण:
{ 1 => 10, 2 => 20 }.sum {|k, v| k * v } #=> 50
(1..10).sum #=> 55
(1..10).sum {|v| v * 2 } #=> 110
इसके लिए भी अनुमति देता है [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
शून्य मानों के साथ सरणी के लिए हम कॉम्पैक्ट कर सकते हैं और फिर राशि पूर्व इंजेक्षन कर सकते हैं-
a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
यदि आप गोल्फ महसूस करते हैं, तो आप कर सकते हैं
eval([123,321,12389]*?+)
यह एक स्ट्रिंग "123 + 321 + 12389" बनाएगा और फिर योग करने के लिए फ़ंक्शन इवल का उपयोग करेगा। यह केवल गोल्फिंग उद्देश्य के लिए है , आपको इसे उचित कोड में उपयोग नहीं करना चाहिए।
विधि 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: जब सरणी में एक शून्य और रिक्त मान होते हैं, तो डिफ़ॉल्ट रूप से यदि आप उपरोक्त किसी भी कार्य का उपयोग करते हैं, तो राशि, योग, सब कुछ के माध्यम से इंजेक्ट करें।
TypeError: nil को Integer में coerced नहीं किया जा सकता है
आप इसे दूर कर सकते हैं,
[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: eval
रूबी अभिव्यक्ति का मूल्यांकन स्ट्रिंग में।
[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+
number = [1..100]
number. each do |n|
final_number = n.sum
puts "The sum is #{final_number}"
end
* इसने मेरे लिए एक नए डेवलपर के रूप में अच्छा काम किया। [] के भीतर मूल्यों को बदलकर आप अपनी संख्या सीमा को समायोजित कर सकते हैं
आप इसे आसान तरीके से भी कर सकते हैं
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
array.sum
array.sum