সুইফ্ট অ্যারেতে উপাদানের যোগফল সন্ধান করা হচ্ছে


228

দ্রুততম ক্ষেত্রে পূর্ণসংখ্যার অ্যারের যোগফল খুঁজে পাওয়ার সহজ (সেরা) উপায় কী? আমার গুণক নামক একটি অ্যারে রয়েছে এবং আমি গুণকের যোগফল জানতে চাই।

উত্তর:


465

এটি আমি খুঁজে পেতে পারি সবচেয়ে সহজ / সংক্ষিপ্ততম পদ্ধতি।

সুইফট 3 এবং সুইফট 4:

let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)

সুইফট 2:

let multiples = [...]
sum = multiples.reduce(0, combine: +)

আরও কিছু তথ্য:

এটি অ্যারের হ্রাস পদ্ধতিটি ( এখানে ডকুমেন্টেশন ) ব্যবহার করে, যা আপনাকে "সরবরাহিত বন্ধকে পুনরাবৃত্তভাবে প্রয়োগ করে উপাদানগুলির সংগ্রহকে একক মানকে কমিয়ে আনতে" দেয়। আমরা এটা প্রাথমিক মান হিসাবে 0 দিতে, এবং তারপর, মূলত, অবসান { $0 + $1 }। অবশ্যই, আমরা এটিকে একটি একক প্লাস চিহ্নকে সহজ করতে পারি, কারণ এটিই সুইফট রোলস।


42
এই উত্তরের জন্য ধন্যবাদ। এটি দুর্দান্ত কাজ করে এবং আমি কেবলমাত্র কাস্টম শ্রেণীর অ্যারে সহ আমার উদাহরণ কোডটি যুক্ত করতে চাই:let totalSum = self.cheques.reduce(0) { $0 + $1.amount}
লিওর জাপলেটাল

2
দুর্দান্ত উত্তর তবে পরামিতিটির নাম নেই combine। হওয়া উচিত multiples.reduce(0, combine: +)
এভেজেনি মাই

2
এটি কি লুপের চেয়ে দ্রুত?
লরেঞ্জো

1
@ সুইফটম্যাট flatMapএটি একক মাত্রার অ্যারে সমতল করার জন্য প্রথমে এটি ব্যবহার করার চেষ্টা করুন । multiArray.flatMap{$0}.reduce(0, combine: +)
সামাহ

2
@ ফ্লোরেনজো - সর্বশেষ সুইফট এবং এক্সকোডের সাথে আইফোন on-তে পরীক্ষা করা (ইউআইএনটি 32 ওভারফ্লো প্রতিরোধের জন্য 256 এ ক্যাপড 1000,000 ইউআইএনটি 32 এ ভরা একটি সাধারণ অ্যারে) আকর্ষণীয়ভাবে দেখায় যে 'ফর' লুপটি কেবলমাত্র একটি চুলের দ্রুত (1.941 সেকেন্ড বনাম 2.137 সেকেন্ড) যদিও যে সুবিধা না 100,000 মান উপস্থিত (0.23 সেকেন্ড প্রতিটি)। আইএমএইচও, কোড স্পষ্টতা এখানে 32MB অ্যারেগুলির সাথে ডিল করার পরেও খুব সামান্য পারফরম্যান্সের জন্য মূল্যবান।
টম ডিবল

83

অবজেক্টের বৈশিষ্ট্যগুলি যোগ করতে 3+ একটি লাইনার স্যুইফ্ট

var totalSum = scaleData.map({$0.points}).reduce(0, +)

যেখানে পয়েন্টগুলি হল আমার কাস্টম অবজেক্ট স্কেলের ডেটা যা আমি হ্রাস করার চেষ্টা করছি


28

সুইফট 3 এ পরিবর্তিত হয়েছে:

let multiples = [...]
sum = multiples.reduce(0, +)

22

ইন সুইফট 4 এছাড়াও আপনি ক্রম উপাদান সীমাবদ্ধ করতে পারেন সাংখ্যিক হিসাবে অনুসরণ ক্রমানুসারে সব উপাদান এর সমষ্টি ফিরে যাওয়ার প্রোটোকল

extension Sequence where Element: Numeric {
    /// Returns the sum of all elements in the collection
    func sum() -> Element { return reduce(0, +) }
}

সম্পাদনা / আপডেট:

এক্সকোড 10.2 • সুইফট 5 বা তারপরে

সংগ্রহের সমস্ত উপাদানগুলির যোগফল ফিরিয়ে দিতে আমরা কেবল নতুন অ্যাডিটিভ আর্থিক প্রোটোকলটিতে ক্রম উপাদানগুলিকে সীমাবদ্ধ করতে পারি

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element {
        return reduce(.zero, +)
    }
}

এক্সকোড 11 • 5.1 বা তার পরে সুইফ্ট

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element { reduce(.zero, +) }
}

let numbers = [1,2,3]
numbers.sum()    // 6

let doubles = [1.5, 2.7, 3.0]
doubles.sum()    // 7.2

1
দুর্দান্ত, দুর্দান্ত সমাধান!
সাবিল্যান্ড


10

সুইফট 4 উদাহরণ

class Employee {
    var salary: Int =  0
    init (_ salary: Int){
        self.salary = salary
    }
}

let employees = [Employee(100),Employee(300),Employee(600)]
var sumSalary = employees.reduce(0, {$0 + $1.salary}) //1000

9

সুইফট 3

আপনার যদি জেনেরিক অবজেক্টের একটি অ্যারে থাকে এবং আপনি কিছু অবজেক্ট প্রোপার্টি যোগ করতে চান তবে:

class A: NSObject {
    var value = 0
    init(value: Int) {
       self.value = value
    }
}

let array = [A(value: 2), A(value: 4)]      
let sum = array.reduce(0, { $0 + $1.value })
//                           ^       ^
//                        $0=result  $1=next A object
print(sum) // 6 

সংক্ষিপ্ত ফর্ম সত্ত্বেও, অনেক সময় আপনি ক্লাসিকের জন্য ক্লাসিকটি পছন্দ করতে পারেন:

let array = [A(value: 2), A(value: 4)]
var sum = 0
array.forEach({ sum += $0.value}) 
// or
for element in array {
   sum += element.value
}

1
Ciao লুকা, এখানে আমার সমাধান: array.map ({$ 0.value}) কমাতে (0 +)।
Ivailo Kanev

এইভাবে আপনি আরও কোড এবং বর্ধিত জটিলতা লেখেন .. তো, কেন?
লুকা দাভানজো

6

কিভাবে সহজ উপায় সম্পর্কে

for (var i = 0; i < n; i++) {
 sum = sum + Int(multiples[i])!
}

// যেখানে এন = অ্যারের উপাদানগুলির সংখ্যা


নোট করুন যে সুইফ্ট 3 এ এটি আর বৈধ নয় কারণ লুপগুলির জন্য সি স্টাইলটি ভাষা থেকে সরানো হয়েছে। পরিবর্তে ইন-লুপগুলি ব্যবহার করুন, সুইফট সূচকের অভ্যন্তরীণভাবে ট্র্যাক রাখে।
ডোনারব

1
এটি এটি হিসাবে কাজ করবে না। আপনাকে প্রথমে যোগফলটি 0 করতে হবে। হ্রাস করার সৌন্দর্যটি এটি আপনাকে প্রাথমিক মানটি মনে করার জন্য মনে করিয়ে দেয়।
মার্ক অরেলিয়াস

var sum = 0 ; for n in multiples { sum += n }যদিও আমি হ্রাস ব্যবহার করব।
জেরেমিপ

2

একটি সম্ভাব্য সমাধান: এটির জন্য একটি উপসর্গ অপারেটর নির্ধারণ করুন। এপিএলের মতো হ্রাস "+ /" অপারেটরের মতো (যেমন জিএনইউ এপিএল)

এখানে একটি ভিন্ন পদ্ধতির একটি বিট।

প্রোটোকল এন জেনেরিক প্রকারের সাহায্যে আমাদের এই অপারেটরটি ডাবল, ফ্লোট এবং ইন্ট অ্যারে টাইপগুলিতে ব্যবহার করতে দেয়

protocol Number 
{
   func +(l: Self, r: Self) -> Self
   func -(l: Self, r: Self) -> Self
   func >(l: Self, r: Self) -> Bool
   func <(l: Self, r: Self) -> Bool
}

extension Double : Number {}
extension Float  : Number {}
extension Int    : Number {}

infix operator += {}

func += <T:Number> (inout left: T, right: T)
{
   left = left + right
}

prefix operator +/ {}

prefix func +/ <T:Number>(ar:[T]?) -> T?
{
    switch true
    {
    case ar == nil:
        return nil

    case ar!.isEmpty:
        return nil

    default:
        var result = ar![0]
        for n in 1..<ar!.count
        {
            result += ar![n]
        }
        return result
   }
}

যেমন ব্যবহার করুন:

let nmbrs = [ 12.4, 35.6, 456.65, 43.45 ]
let intarr = [1, 34, 23, 54, 56, -67, 0, 44]

+/nmbrs     // 548.1
+/intarr    // 145

(এক্সকোড সংস্করণ 7.3 এ পরীক্ষিত সুইফট ২.২-এর জন্য আপডেট হয়েছে)


এটির সাথে একটি সমস্যা হ'ল প্রায়শই (কমপক্ষে, বড় অ্যারেগুলির সাথে কাজ করার সময়) উপাদানগুলির চেয়ে আলাদা ধরণের হওয়ার জন্য আপনার যোগফলের প্রয়োজন হবে। উদাহরণস্বরূপ, যদি আপনার মিলিয়ন ইউআইএনটি 32 থাকে তবে 0 থেকে 2 ^ 32-1 (প্রাক্তন, আরক 4 ব্র্যান্ডম () দ্বারা জনবহুল) চলছে, প্রতিবার আপনার ইউআইএনটি 32 "যোগফল" মান উপচে যাবে।
টম ডিবল

2

সুইফট 3.0

আমার একই সমস্যা ছিল, আমি এই সমাধানটি ডকুমেন্টেশনটিতে পেয়েছি Apple

let numbers = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// 'numberSum' == 10

তবে, আমার ক্ষেত্রে আমার অবজেক্টের একটি তালিকা ছিল, তারপরে আমার আমার তালিকার আমার মানটি পরিবর্তন করতে হবে:

let numberSum = self.list.map({$0.number_here}).reduce(0, { x, y in x + y })

আমার জন্য এই কাজ।


0
@IBOutlet var valueSource: [MultipleIntBoundSource]!

private var allFieldsCount: Int {
    var sum = 0
    valueSource.forEach { sum += $0.count }
    return sum
}

নেস্টেড প্যারামিটারগুলির জন্য এটি ব্যবহার করুন


0

সহজবোধ্য রাখো...

var array = [1, 2, 3, 4, 5, 6, 7, 9, 0]
var n = 0
for i in array {
    n += i
}
print("My sum of elements is: \(n)")

আউটপুট:

আমার উপাদানগুলির যোগফল: 37


0

আমার জন্য, সম্পত্তি ব্যবহার করে এটি এমন ছিল

    let blueKills = match.blueTeam.participants.reduce(0, { (result, participant) -> Int in
        result + participant.kills
    })

-2

সুইফট 3

এখানে প্রদর্শিত সমস্ত অপশন থেকে, এটি আমার জন্য কাজ করেছে।

let arr = [6,1,2,3,4,10,11]


var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)

এটি অন্য উত্তরের একটি অনুলিপি
অ্যাশলে মিলস


-4

এটি এই সম্পর্কে আমার পদ্ধতির। তবে আমি বিশ্বাস করি যে সবচেয়ে ভাল সমাধানটি ইউজারনেম টিবিডি- র উত্তর

var i = 0 
var sum = 0
let example = 0
for elements in multiples{
    i = i + 1
    sum = multiples[ (i- 1)]
    example = sum + example
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.