Golang中结构体排序时遇到的错误问题
Golang中结构体排序时遇到的错误问题 我有以下代码:
func main() {
fmt.Println("hello world")
}
但我无法按以下方式排序: colorado578 YMCA1 YMCA2
(首先按文件名排序,然后按索引排序)
有什么建议吗?
致意
6 回复
有以下几点注意事项:
- 为了正确比较,应该将字符串转换为全大写或全小写
- 只有在字符串相等的情况下才应该按索引进行比较
我已修复此问题:
func main() {
fmt.Println("hello world")
}
你说得对,我用了你的例子但没有仔细思考,抱歉我是初学者。吸取教训了 😞。不过第二个例子,传递两次,应该仍然有效。
d34dbug 提到: 如果将索引转换为字符串并与文件名的大写形式拼接,就可以简单地进行比较并得到期望的顺序:
不,那样行不通。例如,如果只是简单拼接,“YMCA12” 会排在 “YMCA2” 前面;而如果先检查文件名再检查索引,顺序就会正确。
如果你将索引转换为字符串并与文件名的大写形式拼接,就可以简单地进行比较并达到期望的顺序: https://play.golang.org/p/ckO3bH-ilfY
我不确定这种方法与仅通过两次独立遍历进行排序的区别: https://play.golang.org/p/grnQ199W6-0
我认为这取决于切片的长度,因为第二个版本遍历切片的次数应该是前者的两倍。
在Go语言中对结构体进行排序时,需要使用sort包并实现sort.Interface接口。根据你的描述,你希望先按文件名排序,然后按索引排序。以下是一个示例,展示如何对包含文件名和索引的结构体切片进行排序:
package main
import (
"fmt"
"sort"
)
// 定义结构体,包含文件名和索引字段
type FileEntry struct {
FileName string
Index int
}
// 实现sort.Interface接口以便对FileEntry切片排序
type ByNameThenIndex []FileEntry
func (a ByNameThenIndex) Len() int { return len(a) }
func (a ByNameThenIndex) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByNameThenIndex) Less(i, j int) bool {
if a[i].FileName != a[j].FileName {
return a[i].FileName < a[j].FileName
}
return a[i].Index < a[j].Index
}
func main() {
// 示例数据
entries := []FileEntry{
{"YMCA2", 1},
{"colorado578", 2},
{"YMCA1", 3},
{"YMCA1", 1},
{"colorado578", 1},
{"YMCA2", 2},
}
// 排序
sort.Sort(ByNameThenIndex(entries))
// 输出排序结果
for _, entry := range entries {
fmt.Printf("FileName: %s, Index: %d\n", entry.FileName, entry.Index)
}
}
输出结果:
FileName: colorado578, Index: 1
FileName: colorado578, Index: 2
FileName: YMCA1, Index: 1
FileName: YMCA1, Index: 3
FileName: YMCA2, Index: 1
FileName: YMCA2, Index: 2
这个示例首先按FileName字段升序排序,如果FileName相同,则按Index字段升序排序。你可以根据实际需求调整结构体字段和排序逻辑。

