如何在切片的前N个元素上输出迭代?



我需要取申请人的名字,第二个名字和GPA,然后只输出前N个申请人。例如,我有5个申请人,但只有N=3可以通过。为了完成这个任务,我决定使用struct的切片。

结构体是这样的:

type Applicant struct {
firstName  string
secondName string
GPA        float64
}

我创建了一个切片并初始化它:

applicants := []Applicant{}
...
fmt.Scan(&firstName, &lastName, &GPA)
applicants = append(applicants, Applicant{firstName, lastName, GPA})

现在我的任务是只输出名称前三名GPA最高的申请者我已经把这个切片从最好的GPA到最差的GPA排序了。

我尝试像这样做输出申请人切片,但得到错误:

for _, applicant := range applicants {
fmt.Println(applicant.secondName + " " + applicant.secondName)
}

你可以帮我切片名称输出

?

要获得GPA最高的前3个,您首先对切片进行排序(您已经做过的),然后只需创建子切片:

func GetTopThree(applicants []Applicant) []Applicant {
sort.Slice(applicants, func(i, j int) bool {
return applicants[i].GPA > applicants[j].GPA
})
return applicants[:3]
}

你可以创建一个新的切片

func GetTopThreeNames(applicants []Applicant) []string {
var topThree []string
for i := 0; i < int(math.Min(3, float64(len(applicants)))); i++ {
topThree = append(topThree, applicants[i].firstName)
}
return topThree
}

如果您想分别映射名字和姓氏,可以使用以下方法:

func TopThreeNames(applicants []Applicant) [][2]string {
top := applicants[:int(math.Min(3, float64(len(applicants))))]
var names [][2]string
for _, a := range top {
names = append(names, [2]string{a.firstName, a.secondName})
}
return names
}

函数将每个Applicant元素映射到一个长度为2的数组,其中第一个元素等于它的名字,第二个元素等于它的第二个名字。

例如(不安全,因为切片的长度可能为空):

names := TopThreeNames(applicants)

first := names[0]
fmt.Printf("First name: %s and last name: %sn", first[0], first[1])

如果你的任务真的只是打印名字,那么这是一个可能的方法

for i := 0; i < 3 && i < len(applicants); i++ {
fmt.Printf("%s %sn", applicants[i].firstName, applicants[i].secondName)
}

请注意,列表必须先排序,就像其他帖子中显示的那样。

最新更新