按字符串顺序对struct进行排序,其值为

时间:2017-09-17 06:03:18

标签: go

我正在尝试按照具有相同值的另一个字符串字符的顺序对结构集合进行排序。

以下是一个例子:

package main

import (
    "fmt"
    "sort"
    "strings"
)

type Container struct {
    Initial  string
}

func main() {
    s := "dfah"
    c := []Container{}

    for _, r := range "fadh" {
        c = append(c, Container{Initial: string(r)})
    }

    sort.Slice(c, func(i, j int) bool {
        str := strings.Compare(c[i].Initial, s)

        if str == -1 {
            return true
        } else {
            return false
        }
    })

    fmt.Printf("Result: %s\n", c) // returns 'dafh'
    fmt.Printf("Desired result: %s\n", s) // returns 'dfah'
}

所需的结果将是Container结构的排序集合,与'dfah'字符串的顺序相同。

https://play.golang.org/p/eDW5-xpCzv

它们将始终具有相同的字符/字符数,只是未分类。我不确定实现这一目标的正确方法是什么。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

在切片排序功能中,您需要将c[i].Initials进行比较。这完全是错的。相反,您希望在c[i].Initial之前或之后查找s中是否显示c[j].Initial

以下是一些示例代码,or see it running on the playground

package main

import (
    "fmt"
    "sort"
    "strings"
)

type Container struct {
    Initial string
}

func main() {
    s := "dfah"
    c := []Container{}

    for _, r := range "fadh" {
        c = append(c, Container{Initial: string(r)})
    }

    sort.Slice(c, func(i, j int) bool {
        return strings.Index(s, c[i].Initial) <= strings.Index(s, c[j].Initial)
    })

    fmt.Printf("Result: %s\n", c)         // returns [{d} {f} {a} {h}]
    fmt.Printf("Desired result: %s\n", s) // returns 'dfah'
}

在实践中注意,这是低效的,因为它涉及多次扫描s。如果这是真实的代码,我会构建一个从s字符到其索引的地图,以便strings.Index调用可以被地图查找替换。