如何在Swift对象数组中找到最大值?

DNB*_*ims 7 arrays swift

假设我有一个带Usr对象的数组.和Usr对象有属性age.除了Usr逐个读取对象,并逐个比较age值之外,是否有任何快捷方式可以执行此操作?谢谢.

Kir*_*ins 24

您可以简单地将用户数组映射到用户年龄和查找最大年龄的数组:

class Usr {
    var age: Int

    init(_ age: Int) {
        self.age = age
    }
}

let users = [Usr(1), Usr(8), Usr(5)]

let maxAge = maxElement(users.map{$0.age}) // 8
Run Code Online (Sandbox Code Playgroud)

  • 请注意Swift 3的新语法:let maxAge = users.map {$ 0.age} .maxElement() (8认同)
  • 在Swift 3中使用max()而不是maxElement(). (4认同)

War*_*shi 14

struct User {
    var age: Int
}

let users = [ User(age: 10), User(age: 20), User(age: 30)]
let oldestUser = users.max { $0.age < $1.age }
oldestUser?.age  // 30
Run Code Online (Sandbox Code Playgroud)

  • @toing_toing为什么?`map`单独返回一个元素数组,并应用给定的转换.`max(by:)`用给定的谓词找到序列中的最大元素. (4认同)

Mar*_*cas 10

斯威夫特3:

let users = [Usr(15), Usr(25), Usr(20)]
let max = users.map { $0.age }.max()
Run Code Online (Sandbox Code Playgroud)

// max = 25


Ghu*_*ool 6

使用max(by:)函数

class Usr {
   var age: Int
   init(_ age: Int) {
       self.age = age
   }
}

let users = [Usr(3), Usr(8), Usr(6)]
if let userWithMaxAge : Usr = users.max(by: {$0.age < $1.age}){
    print(userWithMaxAge.age)
}
Run Code Online (Sandbox Code Playgroud)

它将打印 8


kae*_*nio 6

前面的答案有点复杂,并没有准确描述我将通过尊重的方法实现什么。因此,根据您的需求,有两种不同的方法。

如果这是您的型号:

struct Purchase {
   let id: String
   let amount: Double
}
Run Code Online (Sandbox Code Playgroud)

这些是你的对象:

let iPhonePurchase = Purchase(id: "iPhone", amount: 999.00)
let iPadPurchase = Purchase(id: "iPad", amount: 1299.00)
let purchases = [iPhonePurchase, iPadPurchase]
Run Code Online (Sandbox Code Playgroud)

如果您希望对象本身包含最高值,请使用:

let highestPurchase = purchases.max { $0.amount < $1.amount }
Run Code Online (Sandbox Code Playgroud)

这将返回 的对象iPadPurchase

另一方面,如果您不想获取整个对象,则只想获取最高金额值:

let highestPurchase = purchases.map { $0.amount }.max()
Run Code Online (Sandbox Code Playgroud)

在这里你得到的1299.00是最高值。


Khu*_*ong 5

另一种方式:

class Usr {
    var age: Int
    init(_ age: Int) {
        self.age = age
    }
}

let users = [Usr(1), Usr(8), Usr(5)]
let largestAge = users.map{ $0.age }.reduce(0) { $0 > $1 ? $0 : $1 } // 8
Run Code Online (Sandbox Code Playgroud)