亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

按指定字段對結構切片進行排序

按指定字段對結構切片進行排序

Go
叮當貓咪 2023-05-04 16:42:48
假設我有一個SortableStruct包含 3 個字段的結構A B C,我想實現使用的函數sl []SortableStruct,orderFied string其中orderField一個是結構的字段。此函數應重新運行按 排序的切片orderField。有沒有辦法在沒有巨大開關盒的情況下做到這一點。sort.Interface當我想按不同字段比較結構時,如何實現對我來說并不難。
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

嗯,最簡單的方法是切換field類型并分配一個 SORT 函數。這是您的代碼:


package main


import (

    "fmt"

    "sort"

)


type SortableStruct struct {

    A int

    B int

    C int

}


func sortStruct(arr []SortableStruct, field string) {

    var less func(i, j int) bool

    switch field {

    case "B":

        less = func(i, j int) bool {

            return arr[i].B < arr[j].B

        }

    case "C":

        less = func(i, j int) bool {

            return arr[i].C < arr[j].C

        }

    default:

        less = func(i, j int) bool {

            return arr[i].A < arr[j].A

        }

    }


    sort.Slice(arr, less)

}


func main() {

    arr := []SortableStruct{

        {

            A: 1,

            B: 5,

            C: 3,

        },

        {

            A: 2,

            B: 3,

            C: 20,

        },

        {

            A: -1,

            B: -1,

            C: 10,

        },

    }


    sortStruct(arr, "C")

    fmt.Println(arr)

}

另一個想法是定義 3 個類型,每個類型都實現接口sort.Interface


type SortableStructByA []SortableStruct

type SortableStructByB []SortableStruct

type SortableStructByC []SortableStruct

然后,您必須將切片轉換為所需的類型(取決于您想要的類型)并執行如下操作:


sortableSlice := SortableStructByA(arr)

sort.Sort(sortableSlice)


查看完整回答
反對 回復 2023-05-04
  • 1 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號