Golang中如何从多个数值中获取最大值

Golang中如何从多个数值中获取最大值 我想从患者数据中获取最大的年龄值,

package main

import (
  "fmt"
  "math"
  //"reflect"
)

type patient_details struct {
  name string
  age int
  gender string
}

func main() {
  var patient1 = patient_details{"Jack", 22, "male"}
  var patient2 = patient_details{"Daniel", 34, "male"}
  var patient3 = patient_details{"Sarah", 12, "female"}
  var patient4 = patient_details{"Superman", 52, "male"}

  fmt.Println("who is the oldest patient in our hospital?")

  var oldest_patient = math.Max(patient1.age, patient2.age, patient3.age, patient4.age)

  fmt.Println(oldest_patient)

}

我尝试了 max 函数,但它只适用于两个 float64 变量,有什么建议吗?

谢谢


更多关于Golang中如何从多个数值中获取最大值的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

请问,您能演示一下吗?

感谢大家的支持。

更多关于Golang中如何从多个数值中获取最大值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的帮助,排序方法确实更简单、更容易且代码量更少,尽管循环方法更有趣。

您可以将多个值存储在切片中,然后只需在范围内查找任何值——最小值、最大值等。

排序的最佳时间复杂度是 O(n log n),而一次迭代扫描可以在 O(n) 时间内找到最小值和最大值。

最优解只是一个简单的循环,遍历输入即可。

好的。

这个示例使用了一个简单的 []int 作为例子。

https://play.golang.org/p/w-7i1T7ptWz

	age := []int{patient1.age,patient2.age,patient3.age,patient4.age}

对于小型数组来说这可能不是问题,但对于大型数组来说将是一种内存浪费,解决这个问题无需分配新数组,正如所提到的,仅需一个循环就足以找到最大值和最小值。

可以通过对年龄数组进行排序来找到最大和最小值。

package main

import (
	"fmt"
	"sort"
	//"reflect"
)

type patient_details struct {
	name   string
	age    int
	gender string
}

func main() {
	var patient1 = patient_details{"Jack", 22, "male"}
	var patient2 = patient_details{"Daniel", 34, "male"}
	var patient3 = patient_details{"Sarah", 12, "female"}
	var patient4 = patient_details{"Superman", 52, "male"}

	fmt.Println("who is the oldest patient in our hospital?")
	age := []int{patient1.age,patient2.age,patient3.age,patient4.age}
	sort.Ints(age)

	fmt.Println("smallest:", age[0], ",Oldest:", age[len(age)-1])

}

在Go语言中,math.Max函数确实只能比较两个float64类型的值。要获取多个数值中的最大值,你可以使用循环来比较这些值。以下是针对你的患者数据获取最大年龄的示例代码:

package main

import (
    "fmt"
)

type patient_details struct {
    name   string
    age    int
    gender string
}

func main() {
    var patient1 = patient_details{"Jack", 22, "male"}
    var patient2 = patient_details{"Daniel", 34, "male"}
    var patient3 = patient_details{"Sarah", 12, "female"}
    var patient4 = patient_details{"Superman", 52, "male"}

    fmt.Println("who is the oldest patient in our hospital?")

    // 将患者放入切片中以便遍历
    patients := []patient_details{patient1, patient2, patient3, patient4}

    // 初始化最大年龄为第一个患者的年龄
    maxAge := patients[0].age
    oldestPatient := patients[0].name

    // 遍历所有患者,比较年龄
    for _, patient := range patients {
        if patient.age > maxAge {
            maxAge = patient.age
            oldestPatient = patient.name
        }
    }

    fmt.Printf("The oldest patient is %s with age %d\n", oldestPatient, maxAge)
}

如果你只需要获取最大年龄值而不需要患者姓名,可以使用更简洁的方式:

func main() {
    var patient1 = patient_details{"Jack", 22, "male"}
    var patient2 = patient_details{"Daniel", 34, "male"}
    var patient3 = patient_details{"Sarah", 12, "female"}
    var patient4 = patient_details{"Superman", 52, "male"}

    ages := []int{patient1.age, patient2.age, patient3.age, patient4.age}
    
    maxAge := ages[0]
    for _, age := range ages {
        if age > maxAge {
            maxAge = age
        }
    }
    
    fmt.Println("Maximum age:", maxAge)
}

对于通用情况,你可以创建一个函数来获取任意整数切片中的最大值:

func maxInt(values []int) int {
    if len(values) == 0 {
        return 0
    }
    
    max := values[0]
    for _, v := range values[1:] {
        if v > max {
            max = v
        }
    }
    return max
}

func main() {
    ages := []int{22, 34, 12, 52}
    fmt.Println("Maximum age:", maxInt(ages))
}

从Go 1.21版本开始,标准库中新增了cmp包,其中包含了Max函数,可以用于比较任意可比较类型的值:

package main

import (
    "cmp"
    "fmt"
)

func main() {
    ages := []int{22, 34, 12, 52}
    
    maxAge := ages[0]
    for _, age := range ages[1:] {
        maxAge = cmp.Max(maxAge, age)
    }
    
    fmt.Println("Maximum age:", maxAge)
}
回到顶部