Golang中结构体排序时遇到的错误问题

Golang中结构体排序时遇到的错误问题 我有以下代码:

func main() {
    fmt.Println("hello world")
}

但我无法按以下方式排序: colorado578 YMCA1 YMCA2

(首先按文件名排序,然后按索引排序)

有什么建议吗?

致意

6 回复

谢谢!

更多关于Golang中结构体排序时遇到的错误问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有以下几点注意事项:

  1. 为了正确比较,应该将字符串转换为全大写或全小写
  2. 只有在字符串相等的情况下才应该按索引进行比较

我已修复此问题:

func main() {
    fmt.Println("hello world")
}

你说得对,我用了你的例子但没有仔细思考,抱歉我是初学者。吸取教训了 😞。不过第二个例子,传递两次,应该仍然有效。

https://play.golang.org/p/7VW6N18OHb6

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字段升序排序。你可以根据实际需求调整结构体字段和排序逻辑。

回到顶部