আমি পূর্ণসংখ্যার একটি অ্যারে আছে।
উদাহরণ স্বরূপ:
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(:+)
রুবিতে সমস্যা দেখা দিয়েছে বলে মনে হচ্ছে ১.৮..6 ব্যতিক্রমগুলি "লোকালজম্প ইরার: কোনও ব্লক দেওয়া হয়নি" পপ আপ হতে পারে।
array.sum
আপনাকে অ্যারের মানগুলির যোগফল দিতে পারে।
reduce
, যা inject
(যেমন হিসাবে array.reduce( :+ )
) এর একটি উপনাম ।
inject
পরিবর্তে ব্যবহারের জন্য আপনাকে সতর্ক করবে reduce
।
অথবা রুবি ১.৯ উপায় চেষ্টা করুন:
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, :+)
, শব্দটি হ্রাস ম্যাপ্রেডিউস প্রোগ্রামিং মডেলগুলির উত্থানের সাথে আরও সাধারণ ভাষায় প্রবেশ করছে ।
ইনজেকশন , হ্রাস , ভাঁজ , জমা এবং সংকোচনের বিষয়গুলি ভাঁজ ফাংশনগুলির এক শ্রেণির সমার্থক । আমি আপনার কোড বেস জুড়ে ধারাবাহিকতা সবচেয়ে গুরুত্বপূর্ণ, কিন্তু বিভিন্ন সম্প্রদায় যেহেতু একটি শব্দ অন্য শব্দকে পছন্দ করে তাই বিকল্পগুলি জানার পক্ষে এটি দরকারী।
মানচিত্র-হ্রাস শব্দটির উপর জোর দেওয়ার জন্য, এখানে এমন একটি সংস্করণ রয়েছে যা সেই অ্যারেতে কী শেষ হয় তার থেকে একটু বেশি ক্ষমাযোগ্য।
array.map(&:to_i).reduce(0, :+)
কিছু অতিরিক্ত প্রাসঙ্গিক পড়া:
reduce
ফাংশনটি কী করে তা আমাকে আরও জানান, তবে inject
এটি আরও শীতল শোনায়।
reduce
এবং map
যেমন উচ্চতর-অর্ডার ফাংশন predate MapReduce। অনুপ্রেরণা অন্যভাবে চালায়। এবং ম্যাপ্রেডস অর্থে এটি কোনও সাধারণ ক্রিয়াকলাপ হ্রাসের চেয়ে কিছুটা আলাদা অপারেশন, এতে বিভিন্ন মেশিন কীভাবে যোগাযোগ করে তার জড়িত থাকে।
বিকল্পভাবে (কেবল তুলনার জন্য), আপনি যদি রেলগুলি ইনস্টল করেন (আসলে কেবল অ্যাক্টিভসপোর্ট):
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
, কারণ এটি স্পষ্টভাবে যুক্ত করা হয়েছে।
রুবি> = ২.৪.০ এর জন্য আপনি sum
অঙ্কের থেকে ব্যবহার করতে পারেন ।
[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
জন্য আপনাকে অ্যারের মধ্য দিয়ে দু'বার লুপ করতে হবে: একবার নতুন অ্যারে তৈরি করার জন্য, অন্যটি সদস্যদের যোগফল যোগ করতে হবে। এই পদ্ধতিটি সামান্য আরও ভার্বোজ, তবে আরও কার্যকর।
রুবি ২.৪++ / রেল - array.sum
যেমন[1, 2, 3].sum # => 6
রুবি প্রাক 2.4 - array.inject(:+)
বাarray.reduce(:+)
* দ্রষ্টব্য: #sum
পদ্ধতিটি ২.৪-এর একটি নতুন সংযোজন, enumerable
সুতরাং আপনি এখন array.sum
কেবল রেলগুলিই নয়, খাঁটি রুবিতে ব্যবহার করতে সক্ষম হবেন ।
রুবি 1.8.7 উপায় নিম্নলিখিত:
array.inject(0, &:+)
আপনি কেবল ব্যবহার করতে পারেন:
example = [1,2,3]
example.inject(:+)
inject(:+)
তবে এটি কাজ করে না inject :+
?
এটা যথেষ্ট
[1,2,3].inject('+')
রুবি ২.৪.০ প্রকাশিত হয়েছে এবং এটির একটি পরিসংখ্যক # যোগ পদ্ধতি রয়েছে। সুতরাং আপনি করতে পারেন
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: পূর্ণসংখ্যার সাথে জোর করা যায় না
আপনি এটি দ্বারা কাটিয়ে উঠতে পারেন,
[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+
এটি সবচেয়ে সংক্ষিপ্ততম উপায়। চেষ্টা করে দেখুন
array.inject :+
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