วิธีที่ง่ายที่สุด (ดีที่สุด) ในการหาผลรวมของอาร์เรย์ของจำนวนเต็มอย่างรวดเร็วคืออะไร? ฉันมีอาร์เรย์ที่เรียกว่าทวีคูณและฉันต้องการทราบผลรวมของทวีคูณ
วิธีที่ง่ายที่สุด (ดีที่สุด) ในการหาผลรวมของอาร์เรย์ของจำนวนเต็มอย่างรวดเร็วคืออะไร? ฉันมีอาร์เรย์ที่เรียกว่าทวีคูณและฉันต้องการทราบผลรวมของทวีคูณ
คำตอบ:
นี่เป็นวิธีที่ง่ายที่สุด / สั้นที่สุดที่ฉันสามารถหาได้
Swift 3 และ Swift 4:
let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)
สวิฟท์ 2:
let multiples = [...]
sum = multiples.reduce(0, combine: +)
ข้อมูลเพิ่มเติมบางส่วน:
วิธีนี้ใช้วิธีการลดของ Array (เอกสารประกอบที่นี่ ) ซึ่งช่วยให้คุณ "ลดการรวบรวมองค์ประกอบลงไปเป็นค่าเดียวโดยใช้การปิดแบบซ้ำ ๆ ซ้ำ ๆ " เราจะให้มัน 0 { $0 + $1 }
เป็นค่าเริ่มต้นแล้วเป็นหลักปิด แน่นอนว่าเราสามารถทำให้มันง่ายขึ้นด้วยเครื่องหมายบวกเพียงอย่างเดียวเพราะนั่นเป็นวิธีที่ Swift กลิ้ง
combine
แต่หายไปชื่อพารามิเตอร์ multiples.reduce(0, combine: +)
ควรจะเป็น
flatMap
บนก่อนเพื่อทำให้แบนเป็นอาร์เรย์ขนาดเดียว multiArray.flatMap{$0}.reduce(0, combine: +)
Swift 3+หนึ่งสายการบินเพื่อรวมคุณสมบัติของวัตถุ
var totalSum = scaleData.map({$0.points}).reduce(0, +)
ไหนจุดที่เป็นสถานที่ให้บริการในวัตถุของฉันเองscaleDataว่าฉันกำลังพยายามที่จะลด
Swift3 ได้เปลี่ยนเป็น:
let multiples = [...]
sum = multiples.reduce(0, +)
ในSwift 4คุณยังสามารถ จำกัด องค์ประกอบลำดับไปยังโปรโตคอลตัวเลขเพื่อส่งคืนผลรวมขององค์ประกอบทั้งหมดในลำดับดังต่อไปนี้
extension Sequence where Element: Numeric {
/// Returns the sum of all elements in the collection
func sum() -> Element { return reduce(0, +) }
}
แก้ไข / ปรับปรุง:
Xcode 10.2 • Swift 5 หรือใหม่กว่า
เราสามารถ จำกัด องค์ประกอบลำดับให้กับโปรโตคอลAdditiveArithmeticใหม่เพื่อส่งคืนผลรวมขององค์ประกอบทั้งหมดในคอลเลกชัน
extension Sequence where Element: AdditiveArithmetic {
func sum() -> Element {
return reduce(.zero, +)
}
}
Xcode 11 • Swift 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
สิ่งนี้ยังใช้งานได้:
let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)
ผลลัพธ์จะเป็น: 55
ตัวอย่างของ 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
สวิฟท์ 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
}
วิธีการเกี่ยวกับวิธีง่ายๆ
for (var i = 0; i < n; i++) {
sum = sum + Int(multiples[i])!
}
// โดยที่ n = จำนวนขององค์ประกอบในอาร์เรย์
var sum = 0 ; for n in multiples { sum += n }
แม้ว่าฉันจะใช้ลด
ทางออกที่เป็นไปได้: กำหนดตัวดำเนินการส่วนนำหน้าสำหรับมัน ชอบตัวดำเนินการลด "+ /" เช่นเดียวกับใน APL (เช่น GNU APL)
วิธีการที่แตกต่างกันเล็กน้อยที่นี่
การใช้โปรโตคอล en ประเภททั่วไปทำให้เราสามารถใช้โอเปอเรเตอร์นี้กับประเภท Double, Float และ 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
}
}
ใช้อย่างนั้น:
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
(อัปเดตสำหรับ Swift 2.2 ทดสอบใน Xcode เวอร์ชั่น 7.3)
สวิฟท์ 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 })
งานนี้สำหรับฉัน
@IBOutlet var valueSource: [MultipleIntBoundSource]!
private var allFieldsCount: Int {
var sum = 0
valueSource.forEach { sum += $0.count }
return sum
}
ใช้อันนี้สำหรับพารามิเตอร์ที่ซ้อนกัน
ง่าย ๆ เข้าไว้...
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
สำหรับฉันมันเป็นเช่นนี้โดยใช้คุณสมบัติ
let blueKills = match.blueTeam.participants.reduce(0, { (result, participant) -> Int in
result + participant.kills
})
สวิฟท์ 3
จากตัวเลือกทั้งหมดที่แสดงที่นี่นี่เป็นตัวเลือกที่เหมาะกับฉัน
let arr = [6,1,2,3,4,10,11]
var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)
สำหรับผลรวมขององค์ประกอบในอาร์เรย์ของวัตถุ
self.rankDataModelArray.flatMap{$0.count}.reduce(0, +)
นี่คือแนวทางของฉันเกี่ยวกับเรื่องนี้ แต่ฉันเชื่อว่าทางออกที่ดีที่สุดคือคำตอบจากชื่อผู้ใช้ tbd
var i = 0
var sum = 0
let example = 0
for elements in multiples{
i = i + 1
sum = multiples[ (i- 1)]
example = sum + example
}
let totalSum = self.cheques.reduce(0) { $0 + $1.amount}