Menemukan jumlah elemen dalam array Swift

228

Apa cara termudah (terbaik) untuk menemukan jumlah array bilangan bulat dengan cepat? Saya memiliki array yang disebut banyak dan saya ingin tahu jumlah dari banyak.

ejLev
sumber

Jawaban:

466

Ini adalah metode termudah / terpendek yang dapat saya temukan.

Swift 3 dan Swift 4:

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

Swift 2:

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

Beberapa info lebih lanjut:

Ini menggunakan metode pengurangan Array (dokumentasi di sini ), yang memungkinkan Anda untuk "mengurangi koleksi elemen ke nilai tunggal dengan secara rekursif menerapkan penutupan yang disediakan". Kami memberikan 0 sebagai nilai awal, dan kemudian, pada dasarnya, penutupan { $0 + $1 }. Tentu saja, kita dapat menyederhanakannya menjadi satu tanda plus, karena itulah cara Swift menggulung.

nama pengguna tbd
sumber
42
Terima kasih atas jawaban ini. Ini berfungsi dengan baik dan saya hanya ingin menambahkan contoh kode saya dengan berbagai kelas khusus:let totalSum = self.cheques.reduce(0) { $0 + $1.amount}
Libor Zapletal
2
Jawaban yang bagus tetapi tidak ada nama parameter combine. Seharusnya multiples.reduce(0, combine: +).
Evgenii
2
Apakah ini lebih cepat daripada for for?
lorenzo
1
@ SwiftMatt Coba gunakan flatMapdi atasnya terlebih dahulu untuk meratakannya ke array dimensi tunggal. multiArray.flatMap{$0}.reduce(0, combine: +)
Samah
2
@lorenzo - Menguji iPhone 7 dengan Swift dan XCode terbaru (array sederhana yang diisi dengan 1.000.000 nilai acak UInt32 yang dibatasi 256 untuk mencegah meluapnya UInt32) secara menarik menunjukkan bahwa 'for' loop hanya lebih cepat dari rambut (1.941 detik versus 2.137 detik) , meskipun keunggulan itu tidak ada pada nilai 100.000 (masing-masing 0,23 detik). IMHO, kejelasan kode bernilai setiap biaya kinerja yang sangat kecil di sini bahkan ketika berhadapan dengan array 32MB.
Tom Dibble
84

Cepat 3+ satu liner untuk menjumlahkan properti objek

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

Di mana poin adalah properti di scaleData objek kustom saya yang saya coba kurangi

Jesus Rodriguez
sumber
28

Swift3 telah berubah menjadi:

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

Dalam Swift 4 Anda juga dapat membatasi elemen urutan ke protokol Numerik untuk mengembalikan jumlah semua elemen dalam urutan sebagai berikut

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

edit / perbarui:

Xcode 10.2 • Swift 5 atau lebih baru

Kita bisa membatasi elemen urutan ke protokol AdditiveArithmetic baru untuk mengembalikan jumlah semua elemen dalam koleksi

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

Xcode 11 • Swift 5.1 atau yang lebih baru

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
Leo Dabus
sumber
1
Hebat, solusi bagus!
sabiland
11

Ini juga berfungsi:

let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)

Hasilnya adalah: 55

Marco Almeida
sumber
10

Contoh Swift 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
Maciej
sumber
9

Cepat 3

Jika Anda memiliki larik objek umum dan Anda ingin menjumlahkan beberapa properti objek, maka:

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 

Meskipun bentuknya lebih pendek, sering kali Anda lebih suka siklus klasik:

let array = [A(value: 2), A(value: 4)]
var sum = 0
array.forEach({ sum += $0.value}) 
// or
for element in array {
   sum += element.value
}
Luca Davanzo
sumber
1
ciao Luca, ini solusinya: array.map ({$ 0.value}) kurangi (0, +)
Ivailo Kanev
Dengan cara ini Anda menulis lebih banyak kode dan menambah kerumitan .. jadi, mengapa?
Luca Davanzo
6

Bagaimana dengan cara sederhana

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

// di mana n = jumlah elemen dalam array

Naishta
sumber
Perhatikan bahwa dalam Swift 3 ini tidak lagi valid karena gaya C untuk loop telah dihapus dari bahasa. Gunakan loop for-in sebagai gantinya, Swift melacak internal indeks.
donarb
1
Itu tidak akan berhasil seperti itu. Anda harus menginisialisasi jumlah menjadi 0 terlebih dahulu. Keindahan mengurangi adalah bahwa hal itu mengingatkan Anda untuk memikirkan nilai awal.
Markururelius
var sum = 0 ; for n in multiples { sum += n }meskipun saya akan menggunakan mengurangi.
JeremyP
2

Solusi yang mungkin: tentukan operator awalan untuk itu. Seperti operator pengurangan "+ /" seperti pada APL (mis. GNU APL)

Sedikit pendekatan yang berbeda di sini.

Menggunakan protokol dan tipe generik memungkinkan kita untuk menggunakan operator ini pada tipe array Double, Float dan Int

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
   }
}

gunakan seperti ini:

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

(diperbarui untuk Swift 2.2, diuji dalam Xcode Versi 7.3)

Ted van Gaalen
sumber
Salah satu masalah dengan ini adalah bahwa seringkali (paling tidak, ketika berhadapan dengan array besar) Anda akan membutuhkan jumlah untuk menjadi tipe yang berbeda dari komponen. Misalnya, jika Anda memiliki sejuta UInt32 yang menjalankan keseluruhan dari 0 hingga 2 ^ 32-1 (ex, diisi oleh arc4random ()), menambahkannya akan menambah nilai "jumlah" UInt32 Anda setiap waktu.
Tom Dibble
2

Swift 3.0

saya punya masalah yang sama, saya temukan di dokumentasi Apple solusi ini.

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

Tapi, dalam kasus saya, saya punya daftar objek, maka saya perlu mengubah nilai daftar saya:

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

ini bekerja untuk saya.

Luan Almeida
sumber
0
@IBOutlet var valueSource: [MultipleIntBoundSource]!

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

menggunakan ini untuk parameter bersarang

Alexey Lysenko
sumber
0

Sederhana saja ...

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)")

Keluaran:

Jumlah elemen saya adalah: 37

Israel Manzo
sumber
0

Bagi saya, ini seperti menggunakan properti

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

Cepat 3

Dari semua opsi yang ditampilkan di sini, inilah yang bekerja untuk saya.

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


var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)
Pemenang
sumber
Ini hanyalah salinan dari jawaban lain
Ashley Mills
-2

Untuk jumlah elemen dalam array Objek

self.rankDataModelArray.flatMap{$0.count}.reduce(0, +)
Manish Mahajan
sumber
-4

ini pendekatan saya tentang ini. namun saya percaya bahwa solusi terbaik adalah jawaban dari nama pengguna pengguna tbd

var i = 0 
var sum = 0
let example = 0
for elements in multiples{
    i = i + 1
    sum = multiples[ (i- 1)]
    example = sum + example
}
pengguna3413044
sumber