MST
星途 面试题库

面试题:Go语言实现Map键值对按自定义结构体字段排序

假设有一个map[string]struct{Name string; Age int}类型的映射,现在需要按照结构体中的Age字段降序对键值对进行排序,并且如果Age相同,则按照Name的字典序升序排列。请阐述实现思路并编写完整的Go代码。
15.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路

    • 首先将map[string]struct{Name string; Age int}类型的映射转换为切片,因为Go语言的标准库排序函数是针对切片的。
    • 定义一个比较函数,该函数先比较Age字段,如果Age相同再比较Name字段。
    • 使用Go标准库的sort.Slice函数对切片进行排序。
  2. Go代码如下

package main

import (
    "fmt"
    "sort"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    personMap := map[string]Person{
        "p1": {"Alice", 25},
        "p2": {"Bob", 20},
        "p3": {"Charlie", 25},
    }

    // 转换为切片
    var people []struct {
        Key    string
        Person Person
    }
    for k, v := range personMap {
        people = append(people, struct {
            Key    string
            Person Person
        }{Key: k, Person: v})
    }

    // 定义比较函数
    sort.Slice(people, func(i, j int) bool {
        if people[i].Person.Age != people[j].Person.Age {
            return people[i].Person.Age > people[j].Person.Age
        }
        return people[i].Person.Name < people[j].Person.Name
    })

    // 输出排序后的结果
    for _, p := range people {
        fmt.Printf("Key: %s, Name: %s, Age: %d\n", p.Key, p.Person.Name, p.Person.Age)
    }
}