我正在尝试按照具有相同值的另一个字符串字符的顺序对结构集合进行排序。
以下是一个例子:
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
它们将始终具有相同的字符/字符数,只是未分类。我不确定实现这一目标的正确方法是什么。有任何想法吗?谢谢!
答案 0 :(得分:1)
在切片排序功能中,您需要将c[i].Initial
与s
进行比较。这完全是错的。相反,您希望在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
调用可以被地图查找替换。